home *** CD-ROM | disk | FTP | other *** search
Text File | 1988-08-16 | 243.6 KB | 3,081 lines |
- /* ALP -- ASSEMBLY LANGUAGE PREPROCESSOR -- VERSION 6.19 -- 04/02/88 */00001000
- (SUBRG): /* CHECK SUBSCRIPTS */ /*RAF-3*/ 00001500
- ALP: 00002000
- PROCEDURE OPTIONS(MAIN) REORDER; 00003000
- /*RAF-24*/ 00003100
- DECLARE PLIXOPT CHAR(32) VARYING STATIC EXTERNAL /*RAF-24*/ 00003200
- INIT('ISASIZE(70K)'); /*RAF-40*/ /*RAF-24*/ 00003300
- /*RAF-24*/ 00003400
- DEFAULT RANGE(*) ALIGNED; /*RAF-46*/ 00003500
- /*RAF-46*/ 00003600
- /* 00004000
- INTERNAL PROCEDURES: 00005000
- ALP (MAIN CONTROL PROGRAM) 00006000
- STMNT 00007000
- GROUP 00008000
- CEND,CIF,CCASE,CWHILE,CDO,CFOR,CFOREVER,CGOTO,CEXIT,CNEXT, 00009000
- CUSE,CASMIF,CMACRO,CBAL,CPCASE,ALCSTMT 00010000
- PRED,GB 00011000
- WLABEL,WFLUSH 00012000
- GENSYM 00013000
- 00014000
- INPUT (INPUT SCANNING PROCEDURES) 00015000
- RWORD,ROPANDS 00016000
- RCHECK,RCHAR 00017000
- SKIP,INC,ALPHANUM 00018000
- 00019000
- ERROR,OUTPUT 00020000
- 00021000
- INPUT/OUTPUT CONVENTIONS: 00022000
- 00023000
- INPUT FILE: 00024000
- SYSIN -- CARDS IN ALP LANGUAGE 00025000
- 00026000
- OUTPUT FILES: 00027000
- SYSOUT -- CARD IMAGES FOR BAL ASSEMBLER 00028000
- SYSPRINT -- INPUT IMAGES AND MESSAGES 00029000
- SYSTERM -- MESSAGE DATA SET 00030000
- */ 00031000
- 1 00032000
- %DECLARE (#TRUE,#FALSE,#DUMMY) CHARACTER; 00033000
- %#TRUE='''1''B'; 00034000
- %#FALSE='''0''B'; 00035000
- %#DUMMY='''0''B'; 00036000
- %DECLARE (@OUTER_PREDICATE,@INNER_PREDICATE) CHARACTER; 00037000
- %@OUTER_PREDICATE='''1''B'; 00038000
- %@INNER_PREDICATE='''0''B'; 00039000
- %DECLARE (@USE_NEGATED,@USE_TRUTH) CHARACTER; 00040000
- %@USE_NEGATED='''1''B'; 00041000
- %@USE_TRUTH='''0''B'; 00042000
- %DECLARE (@B,@BR) CHARACTER; 00043000
- %@B='''0''B'; 00044000
- %@BR='''1''B'; 00045000
- 00046000
- %DECLARE CALLINC CHARACTER; 00047000
- %CALLINC = ' DO; ' 00048000
- || ' IF COL>72 THEN CALL INC; ' 00049000
- || ' COL = COL+1; ' 00050000
- || ' IF COL=73 THEN ' 00051000
- || ' CHAR= '' '';' 00052000
- || ' ELSE ' 00053000
- || ' CHAR=SUBSTR(CARDIN,COL,1); ' 00054000
- || ' END '; 00055000
- /*RAF-41*/ 00055100
- % ALPHANUM: PROCEDURE(CHAR) RETURNS(CHARACTER); /*RAF-41*/ 00055200
- DECLARE CHAR CHARACTER; /*RAF-41*/ 00055300
- RETURN('(('||CHAR||')>=''A'' | ('||CHAR||')=''$'' | '|| /*RAF-41*/ 00055400
- '('||CHAR||')=''#'' | ('||CHAR||')=''@'')'); /*RAF-41*/ 00055500
- % END ALPHANUM; /*RAF-41*/ 00055600
- % ACTIVATE ALPHANUM; /*RAF-41*/ 00055700
- 00056000
- %GEN: PROCEDURE(OPERATION,OPERANDS) RETURNS(CHARACTER); 00057000
- DECLARE (OPERATION,OPERANDS) CHARACTER; 00058000
- DECLARE STRING CHARACTER; 00059000
- STRING='DO; '; 00060000
- IF OPERATION ^= '''''' THEN 00061000
- STRING = STRING||'C_OPERATION = '||OPERATION||';'; 00062000
- IF OPERANDS ^= '''''' THEN 00063000
- STRING = STRING||' GEN_OPERANDS('||OPERANDS||');'; /*RAF-11*/ 00064000
- ELSE STRING = STRING||' CALL WFLUSH;'; /*RAF-11*/ 00064500
- RETURN(STRING||' END '); /*RAF-11*/ 00065000
- %END GEN; 00066000
- %ACTIVATE GEN; 00067000
- 00068000
- %GEN_OPERANDS: PROCEDURE(OPERANDS) RETURNS(CHARACTER); /*RAF-11*/ 00069000
- DECLARE OPERANDS CHARACTER; /*RAF-11*/ 00070000
- RETURN(' DO; ' /*RAF-11*/ 00071000
- || ' OP_SAVE = '||OPERANDS||';' /*RAF-11*/ 00072000
- || ' C_OPERANDS = OP_SAVE;' /*RAF-11*/ 00073000
- || ' DO OP_COUNT=53 TO LENGTH(OP_SAVE) BY 56;' /*RAF-11*/ 00074000
- || ' C_CONTINUE = ''*'';' /*RAF-11*/ 00075000
- || ' CALL WFLUSH;' /*RAF-11*/ 00076000
- || ' C_DATA = '''';' /*RAF-11*/ 00077000
- || ' C_CONT_OPERANDS = SUBSTR(OP_SAVE,OP_COUNT);' /*RAF-11*/ 00078000
- || ' END;' /*RAF-11*/ 00079000
- || ' CALL WFLUSH;' /*RAF-11*/ 00080000
- || ' END'); /*RAF-11*/ 00081000
- /*RAF-11*/ 00082000
- /*RAF-11*/ 00083000
- /*RAF-11*/ 00084000
- /*RAF-11*/ 00085000
- %END GEN_OPERANDS; 00086000
- %ACTIVATE GEN_OPERANDS; 00087000
- 1 00088000
- /* "ALP" "INPUT" INTERFACE */ 00089000
- DECLARE 00090000
- INAL FIXED BIN INIT(2), 00091000
- ENDFLG BIT(1) INIT(#FALSE), ENDMARK CHAR(8) STATIC, 00092000
- SYSIN FILE RECORD INPUT, 00093000
- CHAR CHAR(1) INIT(' ') , /* ALWAYS CONTAINS THE CHARACTER 00094000
- POINTED TO BY THE INPUT POINTER */ 00095000
- WORD CHAR(8) VARYING, WORDAL BIT(1), /* SET BY RWORD*/ 00096000
- OPANDS CHAR(2000) VARYING, /* SET BY ROPANDS */ /*RAF-44*/ 00097000
- CARDIN CHAR(80) UNALIGNED, /* INPUT BUFFER*/ /*RAF-46*/ 00098000
- CIN_DATA CHAR(72) POS(1) DEF CARDIN UNALIGNED, /*RAF-46*/ 00099000
- CIN_ID CHAR(8) POS(73) DEF CARDIN UNALIGNED, /*RAF-46*/ 00100000
- CIN_2COLS CHAR(2) POS(1) DEF CARDIN UNAL, /*RAF-46*/ /*RAF-9*/ 00100500
- COL FIXED BIN INIT(80); /* INPUT COLUMN WITHIN CARDIN */ 00101000
- 00102000
- /* "ALP" "OUTPUT" INTERFACE" */ 00103000
- DECLARE 00104000
- SYSPRINT FILE PRINT ENV(FB,RECSIZE(133)), /*RAF-19*/ 00105000
- SYSTERM FILE OUTPUT ENV(FB,RECSIZE(121),BLKSIZE(121)), 00106000
- SYSOUT FILE RECORD OUTPUT ENV(FB,RECSIZE(80),TOTAL),/*RAF-19*/ 00107000
- CARDOUT CHAR(80) INIT(' ') UNAL, /*OUTPUT BUFFER*/ /*RAF-46*/ 00108000
- C_LABEL CHAR(8) POS(1) DEF CARDOUT UNALIGNED, /*RAF-46*/ 00109000
- COL_1 CHAR(1) POS(1) DEF CARDOUT UNALIGNED, /*RAF-46*/ 00110000
- C_DATA CHAR(72) POS(1) DEF CARDOUT UNALIGNED, /*RAF-46*/ 00111000
- COUT_ID CHAR(8) POS(73) DEF CARDOUT UNALIGNED, /*RAF-46*/ 00112000
- C_OPERATION CHAR(8) POS(10) DEF CARDOUT UNALIGNED, /*RAF-46*/ 00113000
- C_OPERANDS CHAR(52) POS(20) DEF CARDOUT UNALIGNED, /*RAF-46*/ 00114000
- C_CONTINUE CHAR(1) POS(72) DEF CARDOUT UNALIGNED, /*RAF-46*/ 00115000
- C_CONT_OPERANDS CHAR(56) POS(16) DEF CARDOUT UNAL, /*RAF-46*/ 00116000
- OP_COUNT FIXED BIN, /*RAF-11*/ 00116100
- OP_SAVE CHAR(2000) VARYING, /*RAF-44*/ /*RAF-11*/ 00116200
- GENNUM FIXED DEC(5) INIT(10000) STATIC; 00117000
- 00118000
- DECLARE 00119000
- ERRCNT FIXED BIN INIT(0), 00120000
- (BRANCH_LAST,IN_MACRO,SUBTITL,LABEL_WRITTEN) BIT(1) INIT(#FALSE), 00121000
- NESTLEV FIXED BIN INIT(0),NESTID(75) CHAR(8), 00122000
- DOLEV FIXED BIN INIT(0), 00123000
- (EXID(75),DOID(75),DOLABEL(75)) CHAR(8) VARYING, 00124000
- ASMDOLEV FIXED BIN INIT(0), /*RAF-9*/ 00124100
- (ASMEXID(75),ASMDOID(75),ASMDOLABEL(75)) /*RAF-9*/ 00124200
- CHAR(8) VARYING, /*RAF-9*/ 00124300
- PREDLABLEV FIXED BIN INIT(0), /*RAF-6*/ 00125000
- PREDLABSTK(100,2) CHAR(14) VARYING, /*RAF-49*/ /*RAF-6*/ 00125500
- PREDBTYPE(50) CHAR(1), /*RAF-6*/ 00126000
- SYMLEV FIXED BIN INIT(0),SYMSTK(3000) CHAR(8) VARYING,/*RAF-38*/ 00127000
- LABLEV FIXED BIN INIT(0),LABSTK(50) CHAR(8) VARYING,/*RAF-42*/ 00128000
- EQVLEV FIXED BIN INIT(0), /*RAF-37*/ 00129000
- EQVSTK(100,2) CHAR(10) VARYING; /*RAF-37*/ 00129500
- 00130000
- DECLARE 00131000
- DTE CHAR(6),TIM CHAR(9),TIME_STAMP CHAR(20), 00132000
- PAGECNT FIXED BIN INIT(0), 00133000
- DECKNAME CHAR(8) INIT(' '), 00134000
- TITLE CHAR(72) INIT( 00135000
- 'A L P : A S S E M B L E R P R E P R O C E S S O R .' 00136000
- ), 00137000
- SUBTITLE CHAR(72) INIT(' '); 00138000
- 0 00139000
- /* "ALP" RETURN CODE */ 00140000
- DECLARE 00141000
- RETCODE FIXED BINARY(31) INIT(0); 00142000
- 1 00143000
- DECLARE 00144000
- PREDICATES (18,2) CHAR(8) STATIC INIT( 00145000
- 'OPENP' , 'NZ' , /* TM */ 00146000
- 'TM' , 'NZ', /* ANY SELECTED BIT ON */ 00147000
- 'TS' , 'NZ', 00148000
- 'TF' , 'NZ', 00149000
- 'TRT' , 'NZ', 00150000
- 'RM' , 'M' , /* REGISTER TESTS */ 00151000
- 'RZ' , 'Z' , 00152000
- 'RP' , 'P' , 00153000
- 'RMZ' , 'NP', 00154000
- 'RMP' , 'NZ', 00155000
- 'RZP' , 'NM', 00156000
- 'RNM' , 'NM', 00157000
- 'RNZ' , 'NZ', 00158000
- 'RNP' , 'NP', 00159000
- 'RNMZ' , 'P' , 00160000
- 'RNMP' , 'Z' , 00161000
- 'RNZP' , 'M' , 00162000
- '***' , 'E'), /* DEFAULT: TRUTH IS EQUAL */ 00163000
- 00164000
- 1 CCTAB STATIC, 00165000
- 2 IVAL(19) INIT((3)0, (5)8, (4)4, (4)2, (3)1), 00166000
- 2 LET CHAR(19) INIT(' N^ 0=EZ 1LM 2PH 3O'), 00167000
- 00168000
- OPTAB (16) CHAR(10) STATIC INIT( 00169000
- 'BC 0,', 00170000
- 'BO', 00171000
- 'BH', 00172000
- 'BC 3,', 00173000
- 'BL', 00174000
- 'BC 5,', 00175000
- 'BC 6,', 00176000
- 'BNE', 00177000
- 'BE', 00178000
- 'BC 9,', 00179000
- 'BC 10,', 00180000
- 'BNL', 00181000
- 'BC 12,', 00182000
- 'BNH', 00183000
- 'BNO', 00184000
- 'BC 15,' ); 00185000
- 1 00186000
- ON ENDFILE(SYSIN) GO TO MAIN_END ; 00187000
- 00188000
- OPEN FILE(SYSPRINT) LINESIZE(132); /*RAF-19*/ 00188500
- ON ENDPAGE(SYSPRINT) 00189000
- BEGIN; 00190000
- PAGECNT = PAGECNT+1; 00191000
- PUT PAGE FILE(SYSPRINT) 00192000
- EDIT(DECKNAME,TITLE,TIME_STAMP,'PAGE ',PAGECNT,SUBTITLE) 00193000
- (A(8),A(72),X(9),A(20),X(3),A(5),P'ZZ9',SKIP,X(8),A(72)); 00194000
- PUT SKIP(2) FILE(SYSPRINT); 00195000
- SUBTITL = #FALSE; 00196000
- END; 00197000
- 00198000
- OPEN FILE(SYSTERM); PUT SKIP FILE(SYSTERM); CLOSE FILE(SYSTERM); 00199000
- OPEN FILE(SYSOUT); /*RAF-19*/ 00200000
- 00201000
- DTE = DATE() ; TIM = TIME() ; 00202000
- TIME_STAMP = SUBSTR(DTE,3,2)||'/'|| 00203000
- SUBSTR(DTE,5,2)||'/'|| 00204000
- SUBSTR(DTE,1,2)||' '|| 00205000
- SUBSTR(TIM,1,2)||':'|| 00206000
- SUBSTR(TIM,3,2)||':'|| 00207000
- SUBSTR(TIM,5,2) ; 00208000
- 00209000
- PUT SKIP FILE(SYSTERM) EDIT('*ALP*',TIME_STAMP) (A,X(2),A); 00210000
- SIGNAL ENDPAGE(SYSPRINT); 00211000
- 1 00212000
- MAIN_LOOP: 00213000
- DO WHILE(#TRUE); /* MAIN PROGRAM LOOP*/ 00214000
- CALL STMNT ; 00215000
- IF ^RCHAR(';') THEN 00216000
- CALL ERROR ('MA10: MISSING SEMICOLON INSERTED.') ; 00217000
- CALL EQVFLUSH(#FALSE,1); 00218000
- END MAIN_LOOP ; 00219000
- 00220000
- MAIN_END : 00221000
- CALL EQVFLUSH(#TRUE,1); 00222000
- IF ^ENDFLG THEN 00223000
- CALL ERROR('MAIN: MISSING "END" AT END OF PROGRAM.'); 00224000
- WORD = 'END'; 00225000
- COL = 1; 00226000
- SUBSTR(CARDIN,1,1),CHAR = ';'; 00227000
- CALL ALCSTMT; 00228000
- IF NESTLEV^=0 THEN 00229000
- DO; 00230000
- CALL OUTPUT(' '); 00231000
- CALL OUTPUT('MISSING "END"/">" FOR "BEGIN"/"<" AT:'); 00232000
- DO NESTLEV = NESTLEV TO 1 BY -1; 00233000
- CALL OUTPUT(NESTID(NESTLEV)); 00234000
- END; 00235000
- RETCODE=8; 00236000
- END; 00237000
- CALL OUTPUT(' '); 00238000
- IF ERRCNT = 0 THEN 00239000
- CALL OUTPUT('NO ALP STATEMENTS FLAGGED.'); 00240000
- ELSE 00241000
- IF ERRCNT = 1 THEN 00242000
- CALL OUTPUT('1 ALP STATEMENT FLAGGED.'); 00243000
- ELSE 00244000
- CALL OUTPUT(ERRCNT||' ALP STATEMENTS FLAGGED.'); 00245000
- CALL OUTPUT(' '); 00246000
- CLOSE FILE(SYSTERM),FILE(SYSPRINT),FILE(SYSOUT),FILE(SYSIN); 00247000
- CALL PLIRETC(RETCODE); 00248000
- RETURN ; 00249000
- 1 00250000
- STMNT: /* PROCESS ONE STATEMENT (SIMPLE OR COMPOUND) */ 00251000
- PROCEDURE RECURSIVE ; 00252000
- DCL 00253000
- SAVID CHAR(8); 00254000
- 00255000
- ST: 00256000
- CALL RLABEL ; 00257000
- IF ENDFLG THEN 00258000
- DO; 00259000
- CALL ERROR('ST10: EXTRANEOUS OR LABELED "END" AT ' 00260000
- ||ENDMARK||' IGNORED.'); 00261000
- ENDFLG = #FALSE; 00262000
- END; 00263000
- IF WORD = ';' THEN 00264000
- RETURN; 00265000
- SAVID = CIN_ID; 00266000
- IF ^WORDAL THEN 00267000
- IF WORD = '<' THEN 00268000
- DO; 00269000
- CALL GROUP(#FALSE,SAVID); 00270000
- RETURN; 00271000
- END; 00272000
- ELSE 00273000
- DO; 00274000
- CALL ERROR('ST15: "'||WORD||'" OUT OF CONTEXT, IGNORED.');00275000
- GO TO ST; 00276000
- END; 00277000
- 00278000
- /* WORD IS A SYMBOL */ 00279000
- IF WORD = 'BEGIN' THEN 00280000
- DO; 00281000
- CALL GROUP(#TRUE,SAVID); 00282000
- RETURN; 00283000
- END; 00284000
- ELSE 00285000
- IF RCHAR(':') THEN 00286000
- DO; 00287000
- CALL WLABEL(WORD); 00288000
- GO TO ST; 00289000
- END; 00290000
- 1 00291000
- /* IDENTIFY ALP INSTRUCTIONS */ 00292000
- IF WORD = 'IF' THEN 00293000
- CALL CIF ; 00294000
- ELSE 00295000
- IF WORD = 'CASE' THEN 00296000
- CALL CCASE ; 00297000
- ELSE 00298000
- IF WORD = 'WHILE' THEN 00299000
- CALL CWHILE(#FALSE) ; 00300000
- ELSE 00301000
- IF WORD = 'UNTIL' THEN 00302000
- CALL CWHILE(#TRUE); 00303000
- ELSE 00304000
- IF WORD = 'DO' THEN 00305000
- CALL CDO; 00306000
- ELSE 00307000
- IF WORD = 'FOR' THEN 00308000
- CALL CFOR; 00309000
- ELSE 00310000
- IF WORD = 'FOREVER' THEN 00311000
- CALL CFOREVER; 00312000
- ELSE 00313000
- IF WORD = 'GOTO' THEN 00314000
- CALL CGOTO(#FALSE); 00315000
- ELSE 00316000
- IF WORD = 'RGOTO' THEN 00317000
- CALL CGOTO(#TRUE); 00318000
- ELSE 00319000
- IF WORD = 'EXIT' THEN 00320000
- CALL CEXIT; 00321000
- ELSE 00322000
- IF WORD = 'USE' THEN 00323000
- CALL CUSE; 00324000
- ELSE 00325000
- IF WORD = 'BAL' THEN 00326000
- DO; 00327000
- IF RCHAR(';') THEN 00328000
- CALL CBAL; 00329000
- ELSE 00330000
- CALL ALCSTMT; 00331000
- END; 00332000
- ELSE IF WORD = 'COMMENT' THEN /*RAF-10*/ 00332100
- DO; /*RAF-10*/ 00332200
- IF RCHAR(';') THEN /*RAF-10*/ 00332300
- CALL CCOMMENT; /*RAF-10*/ 00332400
- ELSE /*RAF-10*/ 00332500
- CALL ALCSTMT; /*RAF-10*/ 00332600
- END; /*RAF-10*/ 00332700
- ELSE IF WORD='DATA' THEN /*RAF-36*/ 00332800
- CALL CDATA; /*RAF-36*/ 00332900
- ELSE 00333000
- IF WORD = 'END' THEN 00334000
- CALL CEND(SAVID); 00335000
- ELSE 00336000
- IF WORD = 'NEXT' THEN 00337000
- CALL CNEXT; 00338000
- ELSE 00339000
- IF WORD='ASM' THEN /*RAF-9*/ 00339100
- CALL CASM; /*RAF-9*/ 00339200
- ELSE /*RAF-9*/ 00339300
- IF WORD = 'ASMIF' THEN 00340000
- CALL CASMIF; 00341000
- ELSE 00342000
- IF WORD = 'MACRO' THEN 00343000
- CALL CMACRO; 00344000
- ELSE 00345000
- IF WORD = 'SELECT' THEN 00346000
- CALL CSELECT; 00347000
- 1 00348000
- ELSE 00349000
- IF WORD='THEN' 00350000
- | WORD='ELSE' 00351000
- | WORD='MEND' /*RAF-8*/ 00352000
- | WORD='ENDMACRO' /*RAF-8*/ 00352500
- | WORD='ENDSEL' 00353000
- | WORD='ENDCASE' THEN 00354000
- DO; 00355000
- CALL ERROR('ST25: INVALID "'||WORD||'" IGNORED.');00356000
- GOTO ST; 00357000
- END; 00358000
- ELSE 00359000
- CALL ALCSTMT; 00360000
- RETURN ; 00361000
- END STMNT ; 00362000
- - 00363000
- /* PROCESS STATEMENT "GROUP" */ 00364000
- GROUP: 00365000
- PROCEDURE(BEGTYPE,CARDID) RECURSIVE ; 00366000
- DECLARE 00367000
- BEGTYPE BIT(1), 00368000
- CARDID CHAR(8); 00369000
- 00370000
- NESTLEV=NESTLEV+1; 00371000
- NESTID(NESTLEV)=CARDID; 00372000
- GRLOOP: 00373000
- DO WHILE(#TRUE) ; 00374000
- IF ^BEGTYPE THEN DO; /*RAF-7*/ 00375000
- IF RCHAR('>') THEN GO TO GROUT; /*RAF-7*/ 00375500
- END; /*RAF-7*/ 00376000
- ELSE IF RCHECK('END') THEN GO TO GROUT; /*RAF-7*/ 00376500
- CALL STMNT ; 00377000
- IF ENDFLG THEN /*RAF-7*/ 00377100
- DO; /*RAF-7*/ 00377200
- CALL ERROR('GR11: EXTRANEOUS OR LABELED "END"' /*RAF-7*/ 00377300
- ||' AT '||ENDMARK||' IGNORED.'); /*RAF-7*/ 00377400
- ENDFLG = #FALSE; /*RAF-7*/ 00377500
- END; /*RAF-7*/ 00377600
- IF ^BEGTYPE THEN DO; /*RAF-7*/ 00378000
- IF RCHAR('>') THEN GO TO GROUT; /*RAF-7*/ 00378500
- END; /*RAF-7*/ 00379000
- ELSE IF RCHECK('END') THEN GO TO GROUT; /*RAF-7*/ 00379500
- IF ^RCHAR (';') THEN 00380000
- CALL ERROR('GR10: MISSING SEMICOLON INSERTED.'); 00381000
- END GRLOOP; 00382000
- GROUT: 00383000
- NESTLEV=NESTLEV-1; 00384000
- IF NESTLEV=0 THEN PREDLABLEV=0; /*RAF-6*/ 00384500
- RETURN; 00385000
- END GROUP ; 00386000
- 1 00387000
- /* END */ 00388000
- 00389000
- CEND: 00390000
- PROCEDURE(ENDID); 00391000
- DCL 00392000
- ENDID CHAR(8); 00393000
- 00394000
- ENDFLG = #TRUE; 00395000
- ENDMARK = ENDID; 00396000
- RETURN; 00397000
- END CEND; 00398000
- 1 00399000
- /* IF <PREDICATE> THEN <STATEMENT> | 00400000
- IF <PREDICATE> THEN <STATEMENT> ELSE <STATEMENT> */ 00401000
- 00402000
- CIF: 00403000
- PROCEDURE RECURSIVE ; 00404000
- DECLARE 00405000
- (THENPART,ELSEPART,SKIPLABEL) CHAR(8) VARYING; 00406000
- 00407000
- THENPART = ''; 00408000
- ELSEPART = GENSYM; 00409000
- CALL PREDICATE(THENPART,ELSEPART,@OUTER_PREDICATE, 00410000
- #DUMMY,@USE_TRUTH,#DUMMY,@B); 00411000
- IF ^RCHECK('THEN') THEN 00412000
- CALL ERROR('CIF: "THEN" INSERTED AFTER "'||WORD||'".'); 00413000
- CALL STMNT; /* THEN CLAUSE */ 00414000
- IF RCHECK('ELSE') THEN 00415000
- DO ; /* ELSE CLAUSE */ 00416000
- SKIPLABEL = GENSYM; 00417000
- GEN('B',SKIPLABEL); 00418000
- CALL WLABEL(ELSEPART) ; 00419000
- CALL STMNT; /* ELSE CLAUSE */ 00420000
- CALL WLABEL(SKIPLABEL) ; 00421000
- END; 00422000
- ELSE /* NO ELSE CLAUSE */ 00423000
- CALL WLABEL(ELSEPART); 00424000
- RETURN; 00425000
- END CIF ; 00426000
- 1 00427000
- /* CASE <REGISTER> MAX <MAXVAL>; 00428000
- <CASE LIST> 00429000
- ENDCASE */ 00430000
- 00431000
- CCASE: 00432000
- PROCEDURE RECURSIVE; 00433000
- DECLARE 00434000
- (REGID,CLABELB,CLABELI,CLABELE,TLABEL) CHAR(8) VARYING, 00435000
- ELSEPART CHAR(8) VARYING INIT(''), /*RAF-32*/ 00435100
- MINCASE CHAR(80) VARYING INIT('(0)'), /*RAF-32*/ 00435200
- MAXCASE CHAR(80) VARYING INIT(''), /*RAF-32*/ 00435300
- (CLOW,CHIGH) CHAR(80) VARYING, /*RAF-32*/ 00436000
- (EMSG1 CHAR(72) INIT( /*RAF-32*/ 00437000
- '* ERROR IF CASE RANGE NOT A MULTIPLE OF FOUR:'), /*RAF-32*/ 00438000
- EMSG2 CHAR(72) INIT( /*RAF-32*/ 00439000
- '* ERROR IF ORDER OF "THRU" CASES IS INVALID:'), 00440000
- EMSG3 CHAR(72) INIT('* ERROR IF CASE OUT OF RANGE:'), /*RAF-32*/ 00441000
- EMSG4 CHAR(72) INIT('* ERROR IF CASE NOT A MULTIPLE OF FOUR:'), 00442000
- EMSG5 CHAR(72) INIT( /*RAF-32*/ 00442100
- '* ERROR IF CASE RANGE NOT GREATER THAN ZERO:') /*RAF-32*/ 00442200
- ) STATIC; 00443000
- 00444000
- CALL ROPANDS(#TRUE); /*RAF-32*/ 00445000
- IF OPANDS='' THEN /*RAF-32*/ 00446000
- DO; 00447000
- CALL ERROR('CCASE: NO REGISTER ID FOR CASE STATEMENT.'); 00448000
- OPANDS='0'; /*RAF-32*/ /*RAF-8*/ 00449000
- END; 00450000
- REGID = OPANDS; /*RAF-32*/ 00451000
- /* IF ^RCHECK('MAX') THEN */ /*RAF-32*/ /* 00452000
- CALL ERROR('CCASE: "MAX" INSERTED AFTER "'||REGID||'".'); 00453000
- CALL RWORD; 00454000
- IF ^WORDAL THEN 00455000
- DO; 00456000
- CALL ERROR('CCASE: MISSING MAXIMUM CASE INDICATION.'); 00457000
- RETURN; 00458000
- END; */ /*RAF-32*/ 00459000
- DO WHILE('1'B); /*RAF-32*/ 00459020
- IF RCHECK('MAX') THEN DO; /*RAF-32*/ 00459040
- CALL ROPANDS(#TRUE); /*RAF-32*/ 00459060
- MAXCASE='('||OPANDS||')'; /*RAF-32*/ 00459080
- END; /*RAF-32*/ 00459100
- ELSE IF RCHECK('MIN') THEN DO; /*RAF-32*/ 00459120
- CALL ROPANDS(#TRUE); /*RAF-32*/ 00459140
- MINCASE='('||OPANDS||')'; /*RAF-32*/ 00459160
- END; /*RAF-32*/ 00459180
- ELSE IF RCHECK('CHECK') THEN DO; /*RAF-32*/ 00459200
- ELSEPART=GENSYM; /*RAF-32*/ 00459220
- END; /*RAF-32*/ 00459240
- ELSE DO; /*RAF-32*/ 00459260
- IF ^RCHAR(';') THEN /*RAF-32*/ 00459280
- CALL ERROR('CCASE: MISSING SEMICOLON INSERTED'); /*RAF-32*/ 00459300
- GO TO CASEBODY; /*RAF-32*/ 00459320
- END; /*RAF-32*/ 00459340
- END; /*RAF-32*/ 00459360
- CASEBODY: /*RAF-32*/ 00459380
- IF MAXCASE='' THEN DO; /*RAF-32*/ 00459400
- CALL ERROR('CCASE: MAX MUST BE SPECIFIED'); /*RAF-32*/ 00459420
- MAXCASE=MINCASE; /*RAF-32*/ 00459440
- END; /*RAF-32*/ 00459460
- CLABELE = ''; /*RAF-32*/ 00460000
- DOLEV = DOLEV+1; 00461000
- EXID(DOLEV) = ''; /*RAF-8*/ 00462000
- DOID(DOLEV) = GENSYM; /*RAF-15*/ 00463000
- DOLABEL(DOLEV) = CURLAB; 00464000
- /* MAXCASE = WORD; */ /*RAF-32*/ /* 00465000
- DO WHILE(^RCHAR(';')); 00466000
- CALL RWORD; 00467000
- MAXCASE = MAXCASE||WORD; 00468000
- END; 00469000
- MAXCASE='('||MAXCASE||')'; */ /*RAF-32*/ 00470000
- CLABELB = GENSYM; 00471000
- CALL WLABEL(DOID(DOLEV)); /*RAF-15*/ 00471500
- IF ELSEPART^='' THEN DO; /*RAF-32*/ 00471520
- GEN('C',REGID||',=A'||MAXCASE); /*RAF-32*/ 00471540
- GEN('BH',ELSEPART); /*RAF-32*/ 00471560
- IF MINCASE='(0)' THEN DO; /*RAF-32*/ 00471580
- GEN('LTR',REGID||','||REGID); /*RAF-32*/ 00471600
- GEN('BM',ELSEPART); /*RAF-32*/ 00471620
- END; /*RAF-32*/ 00471640
- ELSE DO; /*RAF-32*/ 00471660
- GEN('C',REGID||',=A'||MINCASE); /*RAF-32*/ 00471680
- GEN('BL',ELSEPART); /*RAF-32*/ 00471700
- END; /*RAF-32*/ 00471720
- END; /*RAF-32*/ 00471740
- GEN('B',CLABELB||'-'||MINCASE||'('||REGID||')'); /*RAF-32*/ 00472000
- C_DATA=EMSG1; 00473000
- CALL WFLUSH; 00474000
- GEN('DS','0CL(1+('||MAXCASE||'-'||MINCASE||')/4*4-'|| /*RAF-32*/ 00475000
- MAXCASE||'+'||MINCASE||')'); /*RAF-32*/ 00475100
- C_DATA=EMSG5; /*RAF-32*/ 00475200
- CALL WFLUSH; /*RAF-32*/ 00475300
- GEN('DS','0CL('||MAXCASE||'-'||MINCASE||')'); /*RAF-32*/ 00475400
- CALL WLABEL(CLABELB); 00476000
- IF ELSEPART='' THEN DO; /*RAF-32*/ 00476500
- GEN('DC','(('||MAXCASE||'-'||MINCASE||')/4+1)'|| /*RAF-32*/ 00477000
- 'H''0,0'''); /*RAF-32*/ 00477100
- END; /*RAF-32*/ 00477200
- ELSE DO; /*RAF-32*/ 00477300
- GEN('DC','(('||MAXCASE||'-'||MINCASE||')/4+1)'|| /*RAF-32*/ 00477400
- 'S(X''7F0''(4),'||ELSEPART||')'); /*RAF-32*/ 00477500
- END; /*RAF-32*/ 00477600
- 1 00478000
- NESTLEV = NESTLEV+1; 00479000
- NESTID(NESTLEV) = CIN_ID; 00480000
- /* CALL RWORD; */ /*RAF-32*/ 00481000
- DO WHILE(^RCHECK('ENDCASE')); /*RAF-32*/ 00482000
- IF CLABELE='' /*RAF-32*/ 00482100
- THEN CLABELE=GENSYM; /*RAF-32*/ 00482200
- ELSE GEN('B',CLABELE); /*RAF-32*/ 00482300
- TLABEL = GENSYM; 00483000
- CLABELI = GENSYM; 00484000
- CALL WLABEL(TLABEL); 00485000
- GEN('DS','0H'); 00486000
- DO WHILE('1'B); /*RAF-32*/ 00487000
- /* CLOW,CHIGH = ''; */ /*RAF-32*/ /* 00488000
- DO WHILE(WORD^='THRU' & WORD^=',' & WORD^=':' & WORD^=';'); 00489000
- CLOW = CLOW||WORD; 00490000
- CALL RWORD; 00491000
- END; 00492000
- CLOW='('||CLOW||')'; */ /*RAF-32*/ 00493000
- CALL ROPANDS(#TRUE); /*RAF-32*/ 00493100
- CLOW='('||OPANDS||')'; /*RAF-32*/ 00493200
- CHIGH=''; /*RAF-32*/ 00493300
- IF RCHECK('THRU') THEN /*RAF-32*/ 00494000
- DO ; 00495000
- /* CALL RWORD ; */ /*RAF-32*/ /* 00496000
- DO 00497000
- WHILE(WORD ^= ',' & WORD ^= ':' & WORD ^= ';'); 00498000
- CHIGH = CHIGH||WORD; 00499000
- CALL RWORD ; 00500000
- END; */ /*RAF-32*/ 00501000
- CALL ROPANDS(#TRUE); /*RAF-32*/ 00501100
- CHIGH='('||OPANDS||')'; /*RAF-32*/ 00501200
- END ; 00502000
- /* IF CHIGH^='' THEN */ /*RAF-32*/ 00503000
- /* CHIGH='('||CHIGH||')'; */ /*RAF-32*/ 00504000
- IF RCHAR(';') THEN /*RAF-32*/ 00505000
- DO; 00506000
- CALL ERROR('CCASE: '|| 00507000
- 'MISSING CASE LABEL, CASE IGNORED.'); 00508000
- GO TO NOCASE; /*RAF-32*/ 00509000
- END; 00510000
- 1 00511000
- ELSE 00512000
- DO; 00513000
- C_DATA=EMSG3; 00514000
- CALL WFLUSH; 00515000
- GEN('DS','0CL(1+'||MAXCASE||'-'||CLOW||'),' /*RAF-5*/ 00516000
- ||'0CL(1+'||CLOW||'-'||MINCASE||')'); /*RAF-32,RAF-5*/ 00516100
- C_DATA=EMSG4; 00517000
- CALL WFLUSH; 00518000
- GEN('DS','0CL(1+('||CLOW||'-'||MINCASE|| /*RAF-32*/ 00519000
- ')/4*4-'||CLOW||'+'||MINCASE||')'); /*RAF-32*/ 00519100
- IF CHIGH^='' THEN 00520000
- DO; 00521000
- C_DATA=EMSG2; 00522000
- CALL WFLUSH; 00523000
- GEN('DS','0CL(1+'||CHIGH||'-'||CLOW||')'); 00524000
- C_DATA=EMSG3; 00525000
- CALL WFLUSH; 00526000
- GEN('DS','0CL(1+'||MAXCASE||'-'||CHIGH||')'); 00527000
- C_DATA=EMSG4; 00528000
- CALL WFLUSH; 00529000
- GEN('DS','0CL(1+('||CHIGH||'-'||MINCASE /*RAF-32*/ 00530000
- ||')/4*4-'||CHIGH||'+'||MINCASE||')'); /*RAF-32*/ 00530100
- END; 00531000
- GEN('ORG',CLABELB||'+'||CLOW||'-'||MINCASE); /*RAF-32*/ 00532000
- IF CHIGH = '' THEN 00533000
- DO; 00534000
- C_OPERATION = 'B'; 00535000
- C_OPERANDS = CLABELI; 00536000
- END; 00537000
- ELSE 00538000
- DO; 00539000
- C_OPERATION = 'DC'; 00540000
- C_OPERANDS = '(('||CHIGH||'-'||CLOW|| 00541000
- ')/4+1)S(X''7F0''(4),'||CLABELI||')'; 00542000
- END; 00543000
- CALL WFLUSH; 00544000
- IF ^RCHAR(',') THEN /*RAF-32*/ 00545000
- GO TO END_CASE_LIST; /*RAF-32*/ 00546000
- END; 00547000
- END; 00548000
- END_CASE_LIST: /*RAF-32*/ 00548500
- IF ^RCHAR(':') THEN /*RAF-32*/ 00548600
- CALL ERROR('CCASE: MISSING COLON INSERTED'); /*RAF-32*/ 00548700
- GEN('ORG',TLABEL); 00549000
- IF ^RCHAR(';') THEN 00550000
- DO; 00551000
- CALL WLABEL(CLABELI); 00552000
- BRANCH_LAST=#TRUE; /*RAF-32*/ 00552500
- CALL STMNT; 00553000
- IF ^RCHAR(';') THEN 00554000
- CALL ERROR('CA10: MISSING SEMICOLON INSERTED.') ; 00555000
- /* CALL RWORD; */ /*RAF-32*/ 00556000
- /* IF WORD ^= 'ENDCASE' THEN */ /*RAF-32*/ 00557000
- /* GEN('B',CLABELE); */ /*RAF-32*/ 00558000
- END; 00559000
- ELSE 00560000
- DO; 00561000
- CALL EQVADD((CLABELI),(CLABELE)); 00562000
- /* CALL RWORD; */ /*RAF-32*/ 00563000
- END; 00564000
- NOCASE: /*RAF-32*/ 00564500
- END ; 00565000
- 1 00566000
- NESTLEV = NESTLEV-1; /*RAF-34*/ 00566020
- 00566030
- IF ELSEPART='' THEN DO; /*RAF-32*/ 00566050
- IF RCHECK('ELSE') THEN DO; /*RAF-32*/ 00566100
- CALL ERROR('CCASE: CHECK REQUIRED WITH ELSE'); /*RAF-32*/ 00566150
- CALL STMNT; /*RAF-32*/ 00566200
- END; /*RAF-32*/ 00566250
- END; /*RAF-32*/ 00566300
- ELSE DO; /*RAF-32*/ 00566350
- GEN('B',CLABELE); /*RAF-32*/ 00566400
- CALL WLABEL(ELSEPART); /*RAF-32*/ 00566450
- IF RCHECK('ELSE') /*RAF-32*/ 00566500
- THEN CALL STMNT; /*RAF-32*/ 00566550
- ELSE GEN('DC','H''0'''); /*RAF-32*/ 00566600
- END; /*RAF-32*/ 00566650
- /*RAF-32*/ 00566700
- /* IF DOID(DOLEV)^='' THEN */ /*RAF-15*/ 00567000
- /* CALL EQVADD((DOID(DOLEV)),(CLABELB||'-4')); */ /*RAF-15*/ 00568000
- CALL WLABEL(CLABELE); 00569000
- TLABEL = EXID(DOLEV); /*RAF-8*/ 00569500
- DOLEV = DOLEV-1; 00570000
- /* NESTLEV = NESTLEV-1; */ /*RAF-34*/ 00571000
- IF NESTLEV=0 THEN PREDLABLEV=0; /*RAF-6*/ 00571500
- IF RCHECK('THEN') THEN CALL STMNT; /*RAF-8*/ 00571600
- CALL CWLABEL(TLABEL); /*RAF-9*/ 00571700
- RETURN; 00572000
- END CCASE; 00573000
- 1 00574000
- /* WHILE <PRED> DO <STMNT> | UNTIL <PRED> DO <STMNT> */ 00575000
- 00576000
- CWHILE: 00577000
- PROCEDURE(UWB) RECURSIVE ; 00578000
- DCL 00579000
- UWB BIT(1), /* #FALSE => WHILE */ 00580000
- (TOP,BODY,FAILURE,DO_LABEL,THENPART) CHAR(8) VARYING; 00581000
- 00582000
- DO_LABEL = CURLAB; 00583000
- CALL SWLABEL(TOP); 00584000
- FAILURE = GENSYM; 00585000
- BODY = ''; 00586000
- CALL PREDICATE(BODY,FAILURE,@OUTER_PREDICATE,#DUMMY,UWB,#DUMMY, 00587000
- @B); 00588000
- IF ^RCHECK('DO') THEN 00589000
- CALL ERROR('CWHILE/UNTIL: "DO" INSERTED AFTER "'||WORD||'".'); 00590000
- DOLEV = DOLEV+1; 00591000
- EXID(DOLEV) = ''; 00592000
- DOLABEL(DOLEV) = DO_LABEL; 00593000
- DOID(DOLEV) = TOP; 00594000
- CALL STMNT; 00595000
- GEN('B',TOP); 00596000
- CALL WLABEL(FAILURE); 00597000
- THENPART = EXID(DOLEV); 00598000
- DOLEV = DOLEV-1; 00599000
- IF RCHECK('THEN') THEN 00600000
- CALL STMNT; 00601000
- CALL CWLABEL(THENPART); 00602000
- RETURN; 00603000
- END CWHILE ; 00604000
- 1 00605000
- /* DO <STMNT> UNTIL/WHILE <PRED> | FOR <REGISTER> | FOREVER */ 00606000
- 00607000
- CDO: 00608000
- PROCEDURE RECURSIVE; 00609000
- DCL 00610000
- FEVER BIT(1) INIT(#FALSE), 00611000
- ELEV FIXED BIN, /*RAF-37*/ 00611500
- (BODY,PREDFAIL,THENPART) CHAR(8) VARYING, /*RAF-13*/ /*RAF-8*/ 00612000
- REG CHAR(64) VARYING; /*RAF-13*/ 00612500
- 00613000
- CALL SWLABEL(BODY); 00614000
- PREDFAIL = ''; 00615000
- DOLEV = DOLEV+1; 00616000
- EXID(DOLEV),DOID(DOLEV) = ''; 00617000
- DOLABEL(DOLEV) = CURLAB; 00618000
- CALL STMNT; 00619000
- IF RCHECK('UNTIL') THEN 00620000
- DO; 00621000
- CALL CWLABEL(DOID(DOLEV)); 00622000
- CALL PREDICATE(PREDFAIL,BODY,@OUTER_PREDICATE,#DUMMY, 00623000
- @USE_TRUTH,#DUMMY,@B); 00624000
- END; 00625000
- ELSE 00626000
- IF RCHECK('WHILE') THEN 00627000
- DO; 00628000
- CALL CWLABEL(DOID(DOLEV)); 00629000
- CALL PREDICATE(PREDFAIL,BODY,@OUTER_PREDICATE,#DUMMY, 00630000
- @USE_NEGATED,#DUMMY,@B); 00631000
- END; 00632000
- ELSE 00633000
- IF RCHECK('FOR') THEN 00634000
- DO; 00635000
- CALL CWLABEL(DOID(DOLEV)); 00636000
- CALL ROPANDS(#TRUE); /*RAF-13*/ 00637000
- IF OPANDS^='' THEN /*RAF-13*/ 00638000
- REG=OPANDS; /*RAF-13*/ 00639000
- ELSE 00640000
- DO; 00641000
- REG='0'; 00642000
- CALL ERROR('CDO: MISSING "FOR" REGISTER.'); 00643000
- END; 00644000
- GEN('BCT',REG||','||BODY); 00645000
- END; 00646000
- ELSE 00647000
- IF RCHECK('FOREVER') THEN 00648000
- DO; 00649000
- FEVER = #TRUE; 00650000
- CALL CWLABEL(DOID(DOLEV)); 00651000
- GEN('B',BODY); 00652000
- END; 00653000
- ELSE 00654000
- IF DOID(DOLEV) ^= '' THEN DO; /*RAF-37*/ 00655000
- ELEV = EQVLEV+1; /*RAF-37*/ 00655500
- CALL EQVADD((DOID(DOLEV)),(BODY)); 00656000
- CALL EQVFLUSH(#FALSE,ELEV); /*RAF-37*/ 00656100
- END; /*RAF-37*/ 00656200
- 1 00657000
- THENPART = EXID(DOLEV); /*RAF-8*/ 00657100
- DOLEV = DOLEV-1; /*RAF-8*/ 00657200
- IF RCHECK('THEN') THEN 00658000
- DO; 00659000
- IF FEVER THEN 00660000
- CALL ERROR('CDO: INAPPROPRIATE "THEN" IGNORED.'); 00661000
- CALL STMNT; 00662000
- END; 00663000
- CALL CWLABEL(THENPART); /*RAF-8*/ 00664000
- /* DOLEV = DOLEV-1; */ /*RAF-8*/ 00665000
- RETURN; 00666000
- END CDO; 00667000
- 1 00668000
- /* UTILITY PROCEDURE FOR LOOP CONSTRUCTS */ 00669000
- CURLAB: PROCEDURE RETURNS(CHAR(8) VARYING); 00670000
- DCL CLABEL CHAR(8) VARYING, 00671000
- I FIXED BIN; 00672000
- 00673000
- IF C_LABEL = ' ' 00674000
- | ((SUBSTR(C_LABEL,1,1)<'A' | SUBSTR(C_LABEL,1,1)>'Z') /*RAF-30*/ 00675000
- & SUBSTR(C_LABEL,1,1)^='&') THEN /*RAF-30*/ 00676000
- DO; 00677000
- DO I=LABLEV TO 1 BY -1 00678000
- WHILE(SUBSTR(LABSTK(I),1,1)<'A' 00679000
- | SUBSTR(LABSTK(I),1,1)>'Z'); 00680000
- END; 00681000
- IF I>0 THEN 00682000
- CLABEL = LABSTK(I); 00683000
- ELSE 00684000
- CLABEL = ''; 00685000
- END; 00686000
- ELSE 00687000
- CLABEL = C_LABEL; 00688000
- RETURN(CLABEL); 00689000
- END CURLAB; 00690000
- 1 00691000
- /* FOR <REGISTER> DO <STATEMENT> */ 00692000
- 00693000
- CFOR: 00694000
- PROCEDURE RECURSIVE; 00695000
- DCL 00696000
- (GEN1,GEN2,GEN3) CHAR(8) VARYING, /*RAF-13*/ 00697000
- REG CHAR(64) VARYING; /*RAF-13*/ 00697500
- 00698000
- GEN3 = CURLAB; 00699000
- GEN1 = GENSYM; 00700000
- GEN2 = GENSYM; 00701000
- DOLEV = DOLEV+1; 00702000
- EXID(DOLEV),DOID(DOLEV) = ''; 00703000
- DOLABEL(DOLEV) = GEN3; 00704000
- CALL ROPANDS(#TRUE); /*RAF-13*/ 00705000
- IF OPANDS^='' THEN /*RAF-13*/ 00706000
- REG = OPANDS; /*RAF-13*/ 00707000
- ELSE 00708000
- DO; 00709000
- REG = '0'; 00710000
- CALL ERROR('CFOR: MISSING "FOR" REGISTER.'); 00711000
- END; 00712000
- GEN('LTR',REG||','||REG); 00713000
- GEN('BNP',GEN2); 00714000
- CALL WLABEL(GEN1); 00715000
- IF ^RCHECK('DO') THEN 00716000
- CALL ERROR('CFOR: "DO" INSERTED AFTER "'||REG||'".'); 00717000
- CALL STMNT; 00718000
- CALL CWLABEL(DOID(DOLEV)); 00719000
- GEN('BCT',REG||','||GEN1); 00720000
- CALL WLABEL(GEN2); 00721000
- GEN3 = EXID(DOLEV); 00722000
- DOLEV = DOLEV-1; 00723000
- IF RCHECK('THEN') THEN 00724000
- CALL STMNT; 00725000
- CALL CWLABEL(GEN3); 00726000
- RETURN; 00727000
- END CFOR; 00728000
- 1 00729000
- /* FOREVER DO <STATEMENT> */ 00730000
- 00731000
- CFOREVER: 00732000
- PROCEDURE RECURSIVE ; 00733000
- DCL 00734000
- (GEN1,GEN2) CHAR(8) VARYING; 00735000
- 00736000
- GEN1 = CURLAB; 00737000
- CALL SWLABEL(GEN2) ; 00738000
- DOLEV = DOLEV+1; 00739000
- EXID(DOLEV),DOID(DOLEV) = ''; 00740000
- DOLABEL(DOLEV) = GEN1; 00741000
- IF ^RCHECK('DO') THEN 00742000
- CALL ERROR('CFOREVER: "DO" ASSUMED AFTER "FOREVER".'); 00743000
- CALL STMNT ; 00744000
- CALL CWLABEL(DOID(DOLEV)); 00745000
- GEN('B',GEN2); 00746000
- CALL CWLABEL(EXID(DOLEV)); 00747000
- DOLEV = DOLEV-1; 00748000
- IF RCHECK('THEN') THEN 00749000
- CALL ERROR('CFOREVER: INAPPROPRIATE "THEN" IGNORED.'); 00750000
- RETURN; 00751000
- END CFOREVER ; 00752000
- 1 00753000
- /* GOTO <LABEL> | GOTO <LABEL> IF <PREDICATE> */ 00754000
- /* RGOTO <LABEL> | RGOTO <LABEL> IF <PREDICATE> */ 00755000
- 00756000
- CGOTO: 00757000
- PROCEDURE(RTYPE) RECURSIVE; 00758000
- DCL 00759000
- RTYPE BIT(1); 00760000
- DCL 00761000
- IFF BIT(1), /* FOR RCHECK */ 00762000
- TARGET CHAR(25) VARYING, 00763000
- FAIL CHAR(8) VARYING; 00764000
- 00765000
- CALL ROPANDS(#FALSE); /*RAF-39*/ /*RAF-9*/ 00766000
- TARGET = OPANDS; 00767000
- FAIL = ''; 00768000
- IF RCHECK('IF') THEN 00769000
- IF CHAR = ';' | CHAR = '>' THEN 00770000
- CALL ERROR('CGOTO: EXTRANEOUS "IF" IGNORED.'); 00771000
- ELSE 00772000
- CALL PREDICATE(FAIL,TARGET,@OUTER_PREDICATE,#DUMMY, 00773000
- @USE_NEGATED,#DUMMY,RTYPE); 00774000
- ELSE 00775000
- DO; 00776000
- IF RTYPE THEN 00777000
- C_OPERATION = 'BR'; 00778000
- ELSE 00779000
- C_OPERATION = 'B'; 00780000
- GEN('',OPANDS); 00781000
- END; 00782000
- RETURN; 00783000
- END CGOTO; 00784000
- 1 00785000
- /* EXIT FROM <BLOCK LABEL> IF <PREDICATE> */ 00786000
- 00787000
- CEXIT: PROCEDURE RECURSIVE; 00788000
- DCL 00789000
- I FIXED BIN, 00790000
- (EXLABEL,FAIL) CHAR(8) VARYING; 00791000
- 00792000
- IF DOLEV > 0 THEN 00793000
- DO; 00794000
- EXLABEL,FAIL = ''; I = 0; 00795000
- IF RCHECK('FROM') THEN 00796000
- IF CHAR = ';' | CHAR = '>' THEN 00797000
- CALL ERROR('CEXIT: EXTRANEOUS "FROM" IGNORED.'); 00798000
- ELSE 00799000
- DO; 00800000
- CALL RLABEL; /*RAF-16*/ 00801000
- IF WORD^='' THEN /*RAF-16*/ 00802000
- DO; 00803000
- DO I=1 TO DOLEV WHILE(DOLABEL(I)^=WORD); 00804000
- END; 00805000
- IF I>DOLEV THEN 00806000
- DO; 00807000
- I = 0; 00808000
- CALL ERROR('CEXIT: NO LABEL TO MATCH "'00809000
- ||WORD||'".'); 00810000
- END; 00811000
- ELSE 00812000
- EXLABEL = EXID(I); 00813000
- END; 00814000
- ELSE 00815000
- CALL ERROR('CEXIT: LABEL MISSING AFTER "FROM".');00816000
- END; 00817000
- IF I=0 THEN I=DOLEV; 00818000
- IF EXLABEL = '' THEN 00819000
- DO; 00820000
- IF EXID(I) = '' THEN 00821000
- EXID(I) = GENSYM; 00822000
- EXLABEL = EXID(I); 00823000
- END; 00824000
- IF RCHECK('IF') THEN 00825000
- IF CHAR = ';' | CHAR = '>' THEN 00826000
- CALL ERROR('CEXIT: EXTRANEOUS "IF" IGNORED.'); 00827000
- ELSE 00828000
- CALL PREDICATE(FAIL,EXLABEL,@OUTER_PREDICATE,#DUMMY, 00829000
- @USE_NEGATED,#DUMMY,@B); 00830000
- ELSE 00831000
- GEN('B',EXLABEL); 00832000
- END; 00833000
- ELSE 00834000
- CALL ERROR('CEXIT: NO CONTAINING LOOP STRUCTURE FOR "EXIT".'); 00835000
- RETURN; 00836000
- END CEXIT ; 00837000
- 1 00838000
- /* NEXT OF <BLOCK LABEL> IF <PREDICATE> */ 00839000
- 00840000
- CNEXT: PROCEDURE RECURSIVE; 00841000
- DCL 00842000
- I FIXED BIN, 00843000
- (NXLABEL,FAIL) CHAR(8) VARYING; 00844000
- 00845000
- IF DOLEV > 0 THEN 00846000
- DO; 00847000
- NXLABEL,FAIL = ''; I = 0; 00848000
- IF RCHECK('OF') THEN 00849000
- IF CHAR = ';' | CHAR = '>' THEN 00850000
- CALL ERROR('CNEXT: EXTRANEOUS "OF" IGNORED.'); 00851000
- ELSE 00852000
- DO; 00853000
- CALL RLABEL; /*RAF-16*/ 00854000
- IF WORD^='' THEN /*RAF-16*/ 00855000
- DO; 00856000
- DO I=1 TO DOLEV WHILE(DOLABEL(I)^=WORD); 00857000
- END; 00858000
- IF I>DOLEV THEN 00859000
- DO; 00860000
- I = 0; 00861000
- CALL ERROR('CEXIT: NO LABEL TO MATCH "'00862000
- ||WORD||'".'); 00863000
- END; 00864000
- ELSE 00865000
- NXLABEL = DOID(I); /*RAF-1*/ 00866000
- END; 00867000
- ELSE 00868000
- CALL ERROR('CNEXT: LABEL MISSING AFTER "OF".'); 00869000
- END; 00870000
- IF I=0 THEN I=DOLEV; 00871000
- IF NXLABEL = '' THEN 00872000
- DO; 00873000
- IF DOID(I) = '' THEN 00874000
- DOID(I) = GENSYM; 00875000
- NXLABEL = DOID(I); 00876000
- END; 00877000
- IF RCHECK('IF') THEN 00878000
- IF CHAR = ';' | CHAR = '>' THEN 00879000
- CALL ERROR('CNEXT: EXTRANEOUS "IF" IGNORED.'); 00880000
- ELSE 00881000
- CALL PREDICATE(FAIL,NXLABEL,@OUTER_PREDICATE,#DUMMY, 00882000
- @USE_NEGATED,#DUMMY,@B); 00883000
- ELSE 00884000
- GEN('B',NXLABEL); 00885000
- END; 00886000
- ELSE 00887000
- CALL ERROR('CNEXT: NO CONTAINING LOOP STRUCTURE FOR "NEXT".'); 00888000
- RETURN; 00889000
- END CNEXT ; 00890000
- 1 00891000
- /* USE <REGISTER> AS <DSECT> IN <STATEMENT> */ 00892000
- 00893000
- CUSE: 00894000
- PROCEDURE RECURSIVE; 00895000
- DCL 00896000
- REGSTR CHAR(51) VAR INIT(''), 00897000
- MULTUSE BIT(1) INIT(#TRUE), 00898000
- (REG,CONBLK) CHAR(8) VARYING; 00899000
- 00900000
- CALL LABPUSH; 00901000
- DO WHILE(MULTUSE); 00902000
- CALL RWORD; 00903000
- IF WORDAL THEN 00904000
- REG = WORD; 00905000
- ELSE 00906000
- DO; 00907000
- REG = '?'; 00908000
- CALL ERROR('CUSE: MISSING "USING" REGISTER, "'|| 00909000
- WORD||'" IGNORED'); 00910000
- END; 00911000
- IF ^RCHECK('AS') THEN 00912000
- CALL ERROR('CUSE: "AS" ASSUMED BEFORE "'||WORD||'".'); 00913000
- CALL RWORD; 00914000
- IF WORDAL | WORD = '*' THEN 00915000
- CONBLK = WORD; 00916000
- ELSE 00917000
- DO; 00918000
- CONBLK = '???'; 00919000
- CALL ERROR('CUSE: MISSING DSECT IDENTIFIER, "'|| 00920000
- WORD||'" IGNORED'); 00921000
- END; 00922000
- GEN('USING',CONBLK||','||REG); 00923000
- REGSTR = REGSTR||','||REG; 00924000
- MULTUSE = RCHAR(','); 00925000
- END; 00926000
- IF ^RCHECK('IN') THEN 00927000
- CALL ERROR('CUSE: "IN" ASSUMED AFTER "'||CONBLK||'".'); 00928000
- CALL STMNT; 00929000
- CALL LABPUSH; 00930000
- GEN('DROP',SUBSTR(REGSTR,2)); 00931000
- RETURN; 00932000
- END CUSE; 00933000
- 1 00933010
- CASM: PROCEDURE RECURSIVE; /*RAF-9*/ 00933020
- /*RAF-9*/ 00933030
- CALL RWORD; /* GET SUBSTATEMENT NAME */ /*RAF-9*/ 00933040
- /*RAF-9*/ 00933050
- IF WORD='IF' THEN CALL CASMIF; /*RAF-9*/ 00933060
- ELSE IF WORD='CASE' THEN CALL CASMCASE; /*RAF-9*/ 00933070
- ELSE IF WORD='WHILE' THEN CALL CASMWHILE(#FALSE); /*RAF-9*/ 00933080
- ELSE IF WORD='UNTIL' THEN CALL CASMWHILE(#TRUE); /*RAF-9*/ 00933090
- ELSE IF WORD='FOREVER' THEN CALL CASMFOREVER; /*RAF-9*/ 00933100
- ELSE IF WORD='FOR' THEN CALL CASMFOR; /*RAF-9*/ 00933110
- ELSE IF WORD='DO' THEN CALL CASMDO; /*RAF-9*/ 00933120
- ELSE IF WORD='SELECT' THEN CALL CASMSELECT; /*RAF-9*/ 00933130
- ELSE IF WORD='EXIT' THEN CALL CASMEXIT; /*RAF-9*/ 00933140
- ELSE IF WORD='NEXT' THEN CALL CASMNEXT; /*RAF-9*/ 00933150
- ELSE IF WORD='GOTO' THEN CALL CASMGOTO; /*RAF-9*/ 00933160
- ELSE CALL ERROR('CASM: '||WORD||' SHOULD NOT FOLLOW ASM');/*RAF-9*/ 00933170
- /*RAF-9*/ 00933180
- RETURN; /*RAF-9*/ 00933190
- END; /*RAF-9*/ 00933200
- 1 00934000
- /* ASMIF <CONDITION> THEN <STATEMENT> | 00935000
- ASMIF <CONDITION> THEN <STATEMENT> ELSE <STATEMENT> */ 00936000
- 00937000
- CASMIF: 00938000
- PROCEDURE RECURSIVE ; 00939000
- DECLARE 00940000
- (GS1,GS2) CHAR(8) VARYING, 00941000
- ELSEF BIT(1), 00942000
- (L,ELEV) FIXED BIN, 00943000
- CONDSTR CHAR(170) VARYING; 00944000
- 00945000
- /* IF ^RCHAR('(') THEN */ /*RAF-9*/ 00946000
- /* DO; */ /*RAF-9*/ 00947000
- /* CALL ERROR('CASMIF: MISSING CONDITION CLAUSE.')*/ /*RAF-9*/ 00948000
- /* RETURN; */ /*RAF-9*/ 00949000
- /* END; */ /*RAF-9*/ 00950000
- CONDSTR = CONDSCAN(#FALSE); /*RAF-9*/ 00951000
- IF ^RCHECK('THEN') THEN 00952000
- CALL ERROR('CASMIF: "THEN" INSERTED AFTER ")".'); 00953000
- CALL LABPUSH; 00954000
- CALL LABFLUSH; 00955000
- GS1 = GENSEQSYM; 00956000
- C_OPERATION = 'AIF'; 00957000
- CONDSTR = '(NOT '||CONDSTR||')'||GS1; 00958000
- GEN_OPERANDS(CONDSTR); 00959000
- CALL ESQUISH; 00960000
- ELEV = EQVLEV+1; 00961000
- CALL STMNT; 00962000
- CALL LABPUSH; 00963000
- CALL LABFLUSH; 00964000
- CALL EQVFLUSH(#FALSE,ELEV); 00965000
- ELSEF = RCHECK('ELSE'); 00966000
- IF ELSEF THEN 00967000
- DO; 00968000
- GS2 = GENSEQSYM; 00969000
- GEN('AGO',GS2); 00970000
- END; 00971000
- CALL WLABEL(GS1); 00972000
- IF ELSEF THEN 00973000
- DO; 00974000
- CALL ESQUISH; 00975000
- ELEV = EQVLEV+1; 00976000
- CALL STMNT; 00977000
- CALL LABPUSH; 00978000
- CALL LABFLUSH; 00979000
- CALL EQVFLUSH(#FALSE,ELEV); 00980000
- CALL WLABEL(GS2); 00981000
- END; 00982000
- GEN('ANOP',''); 00983000
- RETURN; 00984000
- /*RAF-8*/ 00984005
- END CASMIF; /*RAF-8*/ 00984010
- 1 00984015
- /* ASM CASE <SETA-VAR> ; */ /*RAF-9*/ 00984020
- /* <ASM CASE-LIST> */ /*RAF-9*/ 00984025
- /* ENDCASE */ /*RAF-9*/ 00984030
- /*RAF-9*/ 00984035
- CASMCASE: PROCEDURE RECURSIVE; /*RAF-9*/ 00984040
- /*RAF-9*/ 00984045
- DECLARE /*RAF-9*/ 00984050
- (TCLABEL,NCLABEL,ECLABEL) CHAR(8) VARYING, /*RAF-25*/ /*RAF-9*/ 00984055
- (SETVAR,CLOW) CHAR(170) VARYING; /*RAF-25*/ /*RAF-9*/ 00984060
- /*RAF-9*/ 00984065
- CALL ROPANDS(#FALSE); /* GET SET VARIABLE */ /*RAF-48*/ /*RAF-9*/ 00984070
- IF OPANDS='' THEN DO; /*RAF-9*/ 00984075
- CALL ERROR('CASMCASE-1: NO SET VARIABLE FOR ASM CASE');/*RAF-9*/ 00984080
- OPANDS = '&X'; /*RAF-9*/ 00984085
- END; /*RAF-9*/ 00984090
- SETVAR = OPANDS; /*RAF-9*/ 00984095
- /*RAF-9*/ 00984100
- IF ^RCHAR(';') THEN /*RAF-9*/ 00984105
- CALL ERROR('CASMCASE-2: MISSING SEMICOLON INSERTED'); /*RAF-9*/ 00984110
- /*RAF-9*/ 00984115
- ECLABEL = GENSEQSYM; /* END LABEL */ /*RAF-9*/ 00984120
- TCLABEL = ''; /* THIS-CASE LABEL */ /*RAF-9*/ 00984125
- NCLABEL = GENSEQSYM; /* NEXT-CASE LABEL */ /*RAF-9*/ 00984130
- /*RAF-9*/ 00984135
- ASMDOLEV = ASMDOLEV+1; /*RAF-9*/ 00984140
- ASMDOID(ASMDOLEV) = NCLABEL; /* "NEXT" LABEL */ /*RAF-9*/ 00984145
- ASMEXID(ASMDOLEV) = ''; /* "EXIT" LABEL */ /*RAF-9*/ 00984150
- ASMDOLABEL(ASMDOLEV) = CURSEQSYM; /* "FROM/OF" LABEL */ /*RAF-9*/ 00984155
- /*RAF-9*/ 00984160
- NESTLEV = NESTLEV+1; /* INCREASE NESTING LEVEL */ /*RAF-9*/ 00984165
- NESTID(NESTLEV) = CIN_ID; /*RAF-9*/ 00984170
- /*RAF-9*/ 00984175
- CALL LABPUSH; CALL LABFLUSH; /* CLEAR LABEL STACK */ /*RAF-9*/ 00984180
- /*RAF-9*/ 00984185
- CALL ROPANDS(#TRUE); /* SCAN FOR CASE LABEL */ /*RAF-9*/ 00984190
- DO WHILE(OPANDS^='ENDCASE'); /* LOOP UNTIL ENDCASE */ /*RAF-9*/ 00984195
- IF OPANDS='' THEN /*RAF-9*/ 00984200
- CALL ERROR('CASMCASE-3: MISSING CASE LABEL'); /*RAF-9*/ 00984205
- IF TCLABEL='' THEN DO; /*RAF-9*/ 00984210
- TCLABEL = GENSEQSYM; /*RAF-9*/ 00984215
- CALL CWLABEL(NCLABEL); /* LABEL THIS CASE */ /*RAF-9*/ 00984220
- NCLABEL = GENSEQSYM; /* LABEL FOR NEXT CASE */ /*RAF-9*/ 00984225
- END; /*RAF-9*/ 00984230
- IF ^RCHECK('THRU') THEN DO; /* SINGLE CASE */ /*RAF-9*/ 00984235
- GEN('AIF','('||SETVAR||' EQ '||OPANDS||')'|| /*RAF-9*/ 00984240
- TCLABEL); /*RAF-9*/ 00984245
- END; /*RAF-9*/ 00984250
- ELSE DO; /*RAF-9*/ 00984255
- CLOW = OPANDS; /*RAF-9*/ 00984260
- CALL ROPANDS(#TRUE); /* GET HIGH VALUE */ /*RAF-9*/ 00984265
- GEN('AIF','(('||SETVAR||' GE '||CLOW||') AND ('|| /*RAF-9*/ 00984270
- SETVAR||' LE '||OPANDS||'))'||TCLABEL); /*RAF-9*/ 00984275
- END; /*RAF-9*/ 00984280
- IF RCHAR(',') THEN DO; /* MORE CASES */ /*RAF-9*/ 00984285
- IF TCLABEL='' THEN /*RAF-9*/ 00984290
- CALL ERROR('CASMCASE-4: EXTRANEOUS COMMA IGNORED'); /*RAF-9*/ 00984295
- CALL ROPANDS(#TRUE); /* READ NEXT CASE VALUE */ /*RAF-9*/ 00984300
- END; /*RAF-9*/ 00984305
- ELSE IF RCHAR(':') THEN DO; /* BODY OF CASE */ /*RAF-9*/ 00984310
- IF TCLABEL='' THEN DO; /*RAF-9*/ 00984315
- CALL ERROR('CASMCASE-5: MISSING CASE LABEL'); /*RAF-9*/ 00984320
- END; /*RAF-9*/ 00984325
- GEN('AGO',NCLABEL); /* TRY NEXT CASE */ /*RAF-9*/ 00984330
- CALL CWLABEL(TCLABEL); /* LABEL CASE BODY */ /*RAF-9*/ 00984335
- CALL ASMSTMNT; /* GET A STATEMENT */ /*RAF-9*/ 00984340
- GEN('AGO',ECLABEL); /* EXIT FROM CASE */ /*RAF-9*/ 00984345
- TCLABEL = ''; /* INDICATE NO CASE */ /*RAF-9*/ 00984350
- IF ^RCHAR(';') THEN /*RAF-9*/ 00984355
- CALL ERROR('CASMCASE-6: MISSING SEMICOLON INSERTED' /*RAF-9*/ 00984360
- ); /*RAF-9*/ 00984365
- CALL ROPANDS(#TRUE); /* READ NEXT CASE VALUE */ /*RAF-9*/ 00984370
- END; /*RAF-9*/ 00984375
- ELSE DO; /*RAF-9*/ 00984380
- CALL RWORD; CALL RCHAR(';'); /*RAF-9*/ 00984385
- CALL ERROR('CASMCASE-7: EXTRANEOUS '||WORD|| /*RAF-9*/ 00984390
- ' IGNORED'); /*RAF-9*/ 00984395
- END; /*RAF-9*/ 00984400
- END; /*RAF-9*/ 00984405
- /*RAF-9*/ 00984410
- NESTLEV = NESTLEV-1; /*RAF-25*/ 00984412
- /*RAF-25*/ 00984413
- CALL WLABEL(NCLABEL); /* NO MATCHING CASE */ /*RAF-9*/ 00984415
- GEN('ANOP',''); /*RAF-23*/ 00984417
- IF RCHECK('ELSE') THEN CALL ASMSTMNT; /*RAF-18*/ 00984418
- ELSE GEN('MNOTE','4,''ASM CASE OUT OF RANGE''');/*RAF-9*//*RAF-18*/ 00984420
- /*RAF-9*/ 00984425
- CALL WLABEL(ECLABEL); /* ENDCASE LABEL */ /*RAF-9*/ 00984430
- /*RAF-9*/ 00984435
- ECLABEL = ASMEXID(ASMDOLEV); /*RAF-9*/ 00984440
- ASMDOLEV = ASMDOLEV-1; /*RAF-9*/ 00984445
- /* NESTLEV = NESTLEV-1; */ /*RAF-25*/ /*RAF-9*/ 00984450
- IF NESTLEV=0 THEN PREDLABLEV=0; /*RAF-9*/ 00984455
- IF RCHECK('THEN') THEN /*RAF-9*/ 00984460
- CALL ASMSTMNT; /* GET A STATEMENT */ /*RAF-9*/ 00984465
- /*RAF-9*/ 00984470
- GEN('ANOP',''); /*RAF-22*/ 00984477
- CALL CWLABEL(ECLABEL); /* "EXIT" LABEL */ /*RAF-9*/ 00984478
- GEN('ANOP',''); /*RAF-35*/ 00984479
- END CASMCASE; /*RAF-9*/ 00984480
- 1 00984485
- /* ASM WHILE <COND> DO <STMNT> THEN <STMNT> */ /*RAF-9*/ 00984490
- /* ASM UNTIL <COND> DO <STMNT> THEN <STMNT> */ /*RAF-9*/ 00984495
- /*RAF-9*/ 00984500
- CASMWHILE: PROCEDURE(UWB) RECURSIVE; /*RAF-9*/ 00984505
- /*RAF-9*/ 00984510
- DECLARE /*RAF-9*/ 00984515
- UWB BIT(1), /* FALSE => WHILE */ /*RAF-9*/ 00984520
- (TOP,FAILURE,THENPART) CHAR(8) VARYING; /*RAF-9*/ 00984525
- /*RAF-9*/ 00984530
- TOP = GENSEQSYM; /* TOP OF LOOP */ /*RAF-9*/ 00984535
- FAILURE = GENSEQSYM; /* END LABEL */ /*RAF-9*/ 00984540
- /*RAF-9*/ 00984545
- ASMDOLEV = ASMDOLEV+1; /*RAF-9*/ 00984550
- ASMDOID(ASMDOLEV) = TOP; /* "NEXT" LABEL */ /*RAF-9*/ 00984555
- ASMEXID(ASMDOLEV) = ''; /* "EXIT" LABEL */ /*RAF-9*/ 00984560
- ASMDOLABEL(ASMDOLEV) = CURSEQSYM; /* "FROM" LABEL */ /*RAF-9*/ 00984565
- /*RAF-9*/ 00984570
- CALL LABPUSH; CALL LABFLUSH; /* FLUSH LABEL STACK */ /*RAF-9*/ 00984575
- /*RAF-9*/ 00984580
- CALL WLABEL(TOP); /*RAF-9*/ 00984585
- IF UWB /*RAF-9*/ 00984590
- THEN GEN('AIF',CONDSCAN(#FALSE)||FAILURE); /* UNTIL */ /*RAF-9*/ 00984595
- ELSE GEN('AIF','(NOT '||CONDSCAN(#FALSE)||')'||FAILURE); /*RAF-9*/ 00984600
- /*RAF-9*/ 00984605
- IF ^RCHECK('DO') THEN /*RAF-9*/ 00984610
- CALL ERROR('CASMWHILE/UNTIL: MISSING "DO" INSERTED'); /*RAF-9*/ 00984615
- /*RAF-9*/ 00984620
- CALL ASMSTMNT; /* GET A STATEMENT */ /*RAF-9*/ 00984625
- /*RAF-9*/ 00984630
- GEN('AGO',TOP); /*RAF-9*/ 00984635
- CALL WLABEL(FAILURE); /*RAF-9*/ 00984640
- /*RAF-9*/ 00984645
- THENPART = ASMEXID(ASMDOLEV); /*RAF-9*/ 00984650
- ASMDOLEV = ASMDOLEV-1; /*RAF-9*/ 00984655
- IF RCHECK('THEN') THEN CALL ASMSTMNT; /*RAF-9*/ 00984660
- /*RAF-9*/ 00984665
- CALL CWLABEL(THENPART); /*RAF-9*/ 00984670
- GEN('ANOP',''); /*RAF-22*/ 00984672
- /*RAF-9*/ 00984675
- RETURN; /*RAF-9*/ 00984680
- END CASMWHILE; /*RAF-9*/ 00984685
- 1 00984690
- /* ASM FOR <SETA-VAR> FROM <SETA-EXPR> BY <SETA-EXPR> */ /*RAF-9*/ 00984695
- /* TO <SETA-EXPR> DO <STMNT> THEN <STMNT> */ /*RAF-9*/ 00984700
- /*RAF-9*/ 00984705
- CASMFOR: PROCEDURE RECURSIVE; /*RAF-9*/ 00984710
- /*RAF-9*/ 00984715
- DECLARE /*RAF-9*/ 00984720
- VAR CHAR(8) VARYING, /*RAF-9*/ 00984725
- (FROMVAL,BYVAL,TOVAL) CHAR(170) VARYING, /*RAF-9*/ 00984730
- (TOP,DONE,THENPART) CHAR(8) VARYING; /*RAF-9*/ 00984735
- /*RAF-9*/ 00984740
- TOP = GENSEQSYM; /*RAF-9*/ 00984745
- DONE = GENSEQSYM; /*RAF-9*/ 00984750
- ASMDOLEV = ASMDOLEV+1; /*RAF-9*/ 00984755
- ASMDOID(ASMDOLEV) = ''; /*RAF-9*/ 00984760
- ASMEXID(ASMDOLEV) = ''; /*RAF-9*/ 00984765
- ASMDOLABEL(ASMDOLEV) = CURSEQSYM; /*RAF-9*/ 00984770
- /*RAF-9*/ 00984775
- CALL RLABEL; /* GET SETA VARIABLE */ /*RAF-9*/ 00984780
- IF WORD^='' THEN DO; /*RAF-9*/ 00984785
- IF SUBSTR(WORD,1,1)^='&' THEN /*RAF-9*/ 00984790
- CALL ERROR('CASMFOR-1: ILLEGAL SETA VARIABLE'); /*RAF-9*/ 00984795
- VAR = WORD; /*RAF-9*/ 00984800
- END; /*RAF-9*/ 00984805
- ELSE DO; /*RAF-9*/ 00984810
- CALL ERROR('CASMFOR-2: MISSING SETA VARIABLE'); /*RAF-9*/ 00984815
- VAR = '&X'; /*RAF-9*/ 00984820
- END; /*RAF-9*/ 00984825
- /*RAF-9*/ 00984830
- FROMVAL = '0'; BYVAL = '1'; TOVAL = ''; /* DEFAULTS */ /*RAF-9*/ 00984835
- DO WHILE(#TRUE); /*RAF-9*/ 00984840
- IF RCHECK('DO') THEN GO TO DO_FOUND; /*RAF-9*/ 00984845
- IF RCHECK('FROM') THEN DO; /*RAF-9*/ 00984850
- CALL ROPANDS(#TRUE); /*RAF-9*/ 00984855
- IF OPANDS='' THEN /*RAF-9*/ 00984860
- CALL ERROR('CASMFOR-3: MISSING "FROM" VALUE'); /*RAF-9*/ 00984865
- ELSE FROMVAL = OPANDS; /*RAF-9*/ 00984870
- END; /*RAF-9*/ 00984875
- ELSE IF RCHECK('BY') THEN DO; /*RAF-9*/ 00984880
- CALL ROPANDS(#TRUE); /*RAF-9*/ 00984885
- IF OPANDS='' THEN /*RAF-9*/ 00984890
- CALL ERROR('CASMFOR-4: MISSING "BY" VALUE'); /*RAF-9*/ 00984895
- ELSE BYVAL = OPANDS; /*RAF-9*/ 00984900
- END; /*RAF-9*/ 00984905
- ELSE IF RCHECK('TO') THEN DO; /*RAF-9*/ 00984910
- CALL ROPANDS(#TRUE); /*RAF-9*/ 00984915
- IF OPANDS='' THEN /*RAF-9*/ 00984920
- CALL ERROR('CASMFOR-5: MISSING "TO" VALUE'); /*RAF-9*/ 00984925
- ELSE TOVAL = OPANDS; /*RAF-9*/ 00984930
- END; /*RAF-9*/ 00984935
- ELSE DO; /*RAF-9*/ 00984940
- CALL ERROR('CASMFOR: MISSING "DO" INSERTED'); /*RAF-9*/ 00984945
- GO TO DO_FOUND; /*RAF-9*/ 00984950
- END; /*RAF-9*/ 00984955
- END; /*RAF-9*/ 00984960
- DO_FOUND: /*RAF-9*/ 00984965
- /*RAF-9*/ 00984970
- CALL LABPUSH; CALL LABFLUSH; /*RAF-9*/ 00984975
- CALL WLABEL(VAR); /*RAF-9*/ 00984980
- GEN('SETA',FROMVAL); /*RAF-9*/ 00984985
- CALL WLABEL(TOP); /*RAF-9*/ 00984990
- IF TOVAL^='' THEN DO; /*RAF-9*/ 00984995
- GEN('AIF','(('||BYVAL||' GT 0) AND ('||VAR||' GT '|| /*RAF-9*/ 00985000
- TOVAL||'))'||DONE); /*RAF-9*/ 00985005
- GEN('AIF','(('||BYVAL||' LT 0) AND ('||VAR||' LT '|| /*RAF-9*/ 00985010
- TOVAL||'))'||DONE); /*RAF-9*/ 00985015
- END; /*RAF-9*/ 00985020
- CALL ASMSTMNT; /*RAF-9*/ 00985025
- CALL CWLABEL(ASMDOID(ASMDOLEV)); /*RAF-9*/ 00985030
- CALL WLABEL(VAR); /*RAF-9*/ 00985035
- GEN('SETA',VAR||'+'||BYVAL); /*RAF-9*/ 00985040
- GEN('AGO',TOP); /*RAF-9*/ 00985045
- CALL WLABEL(DONE); /*RAF-9*/ 00985050
- GEN('ANOP',''); /*RAF-35*/ 00985052
- /*RAF-9*/ 00985055
- THENPART = ASMEXID(ASMDOLEV); /*RAF-9*/ 00985060
- ASMDOLEV = ASMDOLEV-1; /*RAF-9*/ 00985065
- IF RCHECK('THEN') THEN CALL ASMSTMNT; /*RAF-9*/ 00985070
- CALL CWLABEL(THENPART); /*RAF-9*/ 00985075
- IF THENPART^='' THEN GEN('ANOP',''); /*RAF-27*/ /*RAF-22*/ 00985077
- /*RAF-9*/ 00985080
- RETURN; /*RAF-9*/ 00985085
- END CASMFOR; /*RAF-9*/ 00985090
- 1 00985095
- /* ASM FOREVER DO <STMNT> */ /*RAF-9*/ 00985100
- /*RAF-9*/ 00985105
- CASMFOREVER: PROCEDURE RECURSIVE; /*RAF-9*/ 00985110
- /*RAF-9*/ 00985115
- DECLARE TOP CHAR(8) VARYING; /*RAF-9*/ 00985120
- /*RAF-9*/ 00985125
- IF ^RCHECK('DO') THEN /*RAF-9*/ 00985130
- CALL ERROR('CASMFOREVER-1: MISSING "DO" INSERTED'); /*RAF-9*/ 00985135
- /*RAF-9*/ 00985140
- TOP = GENSEQSYM; /*RAF-9*/ 00985145
- /*RAF-9*/ 00985150
- ASMDOLEV = ASMDOLEV+1; /*RAF-9*/ 00985155
- ASMDOID(ASMDOLEV) = TOP; /*RAF-9*/ 00985160
- ASMEXID(ASMDOLEV) = ''; /*RAF-9*/ 00985165
- ASMDOLABEL(ASMDOLEV) = CURSEQSYM; /*RAF-9*/ 00985170
- /*RAF-9*/ 00985175
- CALL LABPUSH; CALL LABFLUSH; /*RAF-9*/ 00985180
- /*RAF-9*/ 00985185
- CALL WLABEL(TOP); /*RAF-9*/ 00985190
- CALL ASMSTMNT; /*RAF-9*/ 00985195
- GEN('AGO',TOP); /*RAF-9*/ 00985200
- /*RAF-9*/ 00985205
- IF RCHECK('THEN') THEN /*RAF-9*/ 00985210
- CALL ERROR('CASMFOREVER-2: IAPPROPRIATE "THEN" IGNORED'); /*RAF-9*/ 00985215
- /*RAF-9*/ 00985220
- CALL CWLABEL(ASMEXID(ASMDOLEV)); /* "EXIT" LABEL */ /*RAF-9*/ 00985225
- GEN('ANOP',''); /*RAF-22*/ 00985227
- ASMDOLEV = ASMDOLEV-1; /*RAF-9*/ 00985230
- RETURN; /*RAF-9*/ 00985235
- END CASMFOREVER; /*RAF-9*/ 00985240
- 1 00985245
- /* ASM DO <STMNT> THEN <STMNT> */ /*RAF-9*/ 00985250
- /* ASM DO <STMNT> WHILE/UNTIL <COND> THEN <STMNT> */ /*RAF-9*/ 00985255
- /* ASM DO <STMNT> FOR <SETA-VAR> BY <SETA-EXPR> */ /*RAF-9*/ 00985260
- /* TO <SETA-EXPR> THEN <STMNT> */ /*RAF-9*/ 00985265
- /* ASM DO <STMNT> FOREVER */ /*RAF-9*/ 00985270
- /*RAF-9*/ 00985275
- CASMDO: PROCEDURE RECURSIVE; /*RAF-9*/ 00985280
- /*RAF-9*/ 00985285
- DECLARE /*RAF-9*/ 00985290
- (TOP,EXIT) CHAR(8) VARYING, /*RAF-9*/ 00985295
- THENOK BIT(1) INIT(#TRUE); /*RAF-9*/ 00985300
- /*RAF-9*/ 00985305
- TOP = GENSEQSYM; /* TOP OF LOOP LABEL */ /*RAF-9*/ 00985310
- /*RAF-9*/ 00985315
- ASMDOLEV = ASMDOLEV+1; /*RAF-9*/ 00985320
- ASMDOID(ASMDOLEV),ASMEXID(ASMDOLEV) = ''; /*RAF-9*/ 00985325
- ASMDOLABEL(ASMDOLEV) = CURSEQSYM; /*RAF-9*/ 00985330
- /*RAF-9*/ 00985335
- CALL LABPUSH; CALL LABFLUSH; /*RAF-9*/ 00985340
- CALL WLABEL(TOP); /* LABEL TOP OF LOOP */ /*RAF-9*/ 00985345
- CALL ASMSTMNT; /* GET BODY OF LOOP */ /*RAF-9*/ 00985350
- CALL CWLABEL(ASMDOID(ASMDOLEV)); /* "NEXT" LABEL */ /*RAF-9*/ 00985355
- /*RAF-9*/ 00985360
- IF RCHECK('WHILE') THEN DO; /*RAF-9*/ 00985365
- GEN('AIF',CONDSCAN(#FALSE)||TOP); /*RAF-9*/ 00985370
- END; /*RAF-9*/ 00985375
- ELSE IF RCHECK('UNTIL') THEN DO; /*RAF-9*/ 00985380
- GEN('AIF','(NOT '||CONDSCAN(#FALSE)||')'||TOP); /*RAF-9*/ 00985385
- END; /*RAF-9*/ 00985390
- ELSE IF RCHECK('FOREVER') THEN DO; /*RAF-9*/ 00985395
- GEN('AGO',TOP); /*RAF-9*/ 00985400
- THENOK = #FALSE; /*RAF-9*/ 00985405
- END; /*RAF-9*/ 00985410
- ELSE IF RCHECK('FOR') THEN BEGIN; /*RAF-9*/ 00985415
- DECLARE /*RAF-9*/ 00985420
- VAR CHAR(8) VARYING, /*RAF-9*/ 00985425
- (BYVAL,TOVAL) CHAR(170) VARYING; /*RAF-9*/ 00985430
- CALL RLABEL; /* GET SETA VARIABLE */ /*RAF-9*/ 00985435
- IF WORD^='' THEN DO; /*RAF-9*/ 00985440
- IF SUBSTR(WORD,1,1)^='&' THEN /*RAF-9*/ 00985445
- CALL ERROR('CASMDO-1: ILLEGAL SETA VARIABLE'); /*RAF-9*/ 00985450
- VAR = WORD; /*RAF-9*/ 00985455
- END; /*RAF-9*/ 00985460
- ELSE DO; /*RAF-9*/ 00985465
- CALL ERROR('CASMDO-2: MISSING SETA VARIABLE'); /*RAF-9*/ 00985470
- VAR = '&X'; /*RAF-9*/ 00985475
- END; /*RAF-9*/ 00985480
- BYVAL = '1'; TOVAL=''; /*RAF-9*/ 00985485
- DO WHILE(#TRUE); /*RAF-9*/ 00985490
- IF RCHECK('FROM') THEN DO; /*RAF-9*/ 00985495
- CALL ERROR('CASMFOR-3: INAPPROPRIATE "FROM"'|| /*RAF-9*/ 00985500
- ' IGNORED'); /*RAF-9*/ 00985505
- END; /*RAF-9*/ 00985510
- ELSE IF RCHECK('BY') THEN DO; /*RAF-9*/ 00985515
- CALL ROPANDS(#TRUE); /*RAF-9*/ 00985520
- IF OPANDS='' THEN /*RAF-9*/ 00985525
- CALL ERROR('CASMDO-4: MISSING "BY" VALUE'); /*RAF-9*/ 00985530
- ELSE BYVAL = OPANDS; /*RAF-9*/ 00985535
- END; /*RAF-9*/ 00985540
- ELSE IF RCHECK('TO') THEN DO; /*RAF-9*/ 00985545
- CALL ROPANDS(#TRUE); /*RAF-9*/ 00985550
- IF OPANDS='' THEN /*RAF-9*/ 00985555
- CALL ERROR('CASMDO-5: MISSING "TO" VALUE'); /*RAF-9*/ 00985560
- ELSE TOVAL = OPANDS; /*RAF-9*/ 00985565
- END; /*RAF-9*/ 00985570
- ELSE DO; /*RAF-9*/ 00985575
- GO TO NO_BY_OR_TO; /*RAF-9*/ 00985580
- END; /*RAF-9*/ 00985585
- END; /*RAF-9*/ 00985590
- NO_BY_OR_TO: /*RAF-9*/ 00985595
- /*RAF-9*/ 00985600
- CALL WLABEL(VAR); /*RAF-9*/ 00985605
- GEN('SETA',VAR||'+'||BYVAL); /*RAF-9*/ 00985610
- IF TOVAL^='' THEN DO; /*RAF-9*/ 00985615
- GEN('AIF','(('||BYVAL||' GT 0) AND ('||VAR|| /*RAF-9*/ 00985620
- ' LE '||TOVAL||'))'||TOP); /*RAF-9*/ 00985625
- GEN('AIF','(('||BYVAL||' LT 0) AND ('||VAR|| /*RAF-9*/ 00985630
- ' GE '||TOVAL||'))'||TOP); /*RAF-9*/ 00985635
- END; /*RAF-9*/ 00985640
- ELSE GEN('AGO',TOP); /*RAF-9*/ 00985645
- END; /*RAF-9*/ 00985650
- /*RAF-9*/ 00985655
- EXIT = ASMEXID(ASMDOLEV); /*RAF-9*/ 00985660
- ASMDOLEV=ASMDOLEV-1; /*RAF-9*/ 00985665
- IF RCHECK('THEN') THEN DO; /*RAF-9*/ 00985670
- IF ^THENOK THEN /*RAF-9*/ 00985675
- CALL ERROR('CASMDO-6: INAPPROPRIATE "THEN" IGNORED'); /*RAF-9*/ 00985680
- CALL ASMSTMNT; /*RAF-9*/ 00985685
- END; /*RAF-9*/ 00985690
- CALL CWLABEL(EXIT); /*RAF-9*/ 00985695
- GEN('ANOP',''); /*RAF-22*/ 00985697
- /*RAF-9*/ 00985700
- RETURN; /*RAF-9*/ 00985705
- END CASMDO; /*RAF-9*/ 00985710
- 1 00985715
- /* ASM SELECT (FIRST) */ /*RAF-9*/ 00985720
- /* <COND>: STMNT; ... */ /*RAF-9*/ 00985725
- /* ENDSEL (ELSE STMNT) (THEN STMNT) */ /*RAF-9*/ 00985730
- /*RAF-9*/ 00985735
- CASMSELECT: PROCEDURE RECURSIVE; /*RAF-9*/ 00985740
- /*RAF-9*/ 00985745
- DECLARE /*RAF-9*/ 00985750
- (THENPART,NEXTCASE,EXIT) CHAR(8) VARYING, /*RAF-9*/ 00985755
- FIRST BIT(1); /*RAF-9*/ 00985760
- /*RAF-9*/ 00985765
- NESTLEV = NESTLEV+1; /*RAF-9*/ 00985770
- NESTID(NESTLEV) = CIN_ID; /*RAF-9*/ 00985775
- /*RAF-9*/ 00985780
- FIRST = RCHECK('FIRST'); /*RAF-9*/ 00985785
- IF ^RCHAR(';') THEN /*RAF-9*/ 00985790
- CALL ERROR('CASMSELECT-1: MISSING SEMICOLON INSERTED'); /*RAF-9*/ 00985795
- /*RAF-9*/ 00985800
- THENPART = GENSEQSYM; /*RAF-9*/ 00985805
- NEXTCASE = GENSEQSYM; /*RAF-9*/ 00985810
- EXIT = ''; /*RAF-9*/ 00985815
- IF FIRST THEN EXIT = GENSEQSYM; /*RAF-9*/ 00985820
- /*RAF-9*/ 00985825
- ASMDOLEV = ASMDOLEV+1; /*RAF-9*/ 00985830
- ASMDOID(ASMDOLEV) = NEXTCASE; /*RAF-9*/ 00985835
- ASMEXID(ASMDOLEV) = EXIT; /*RAF-9*/ 00985840
- ASMDOLABEL(ASMDOLEV) = CURSEQSYM; /*RAF-9*/ 00985845
- /*RAF-9*/ 00985850
- CALL LABPUSH; CALL LABFLUSH; /*RAF-9*/ 00985855
- /*RAF-9*/ 00985860
- DO WHILE(^RCHECK('ENDSEL')); /*RAF-9*/ 00985865
- CALL WLABEL(NEXTCASE); /*RAF-9*/ 00985870
- NEXTCASE = GENSEQSYM; /*RAF-9*/ 00985875
- GEN('AIF','(NOT '||CONDSCAN(#FALSE)||')'||NEXTCASE); /*RAF-9*/ 00985880
- IF ^RCHAR(':') THEN /*RAF-9*/ 00985885
- CALL ERROR('CASMSELECT-2: MISSING COLON INSERTED'); /*RAF-9*/ 00985890
- CALL ASMSTMNT; /*RAF-9*/ 00985895
- IF ^RCHAR(';') THEN /*RAF-9*/ 00985900
- CALL ERROR('CASMSELECT-4: MISSING SEMICOLON INSERTED');/*RAF-9*/ 00985905
- IF FIRST THEN GEN('AGO',EXIT); /*RAF-9*/ 00985910
- END; /*RAF-9*/ 00985915
- /*RAF-9*/ 00985920
- CALL WLABEL(NEXTCASE); /*RAF-9*/ 00985925
- NESTLEV = NESTLEV - 1; /*RAF-9*/ 00985930
- /*RAF-9*/ 00985935
- IF RCHECK('ELSE') THEN DO; /*RAF-9*/ 00985940
- IF ^FIRST THEN /*RAF-9*/ 00985945
- CALL ERROR('CASMSELECT-3: ELSE USED WITHOUT FIRST'); /*RAF-9*/ 00985950
- CALL ASMSTMNT; /*RAF-9*/ 00985955
- END; /*RAF-9*/ 00985960
- /*RAF-9*/ 00985965
- EXIT = ASMEXID(ASMDOLEV); /*RAF-9*/ 00985970
- ASMDOLEV = ASMDOLEV - 1; /*RAF-9*/ 00985975
- CALL WLABEL(THENPART); /*RAF-9*/ 00985980
- IF RCHECK('THEN') THEN CALL ASMSTMNT; /*RAF-9*/ 00985985
- CALL CWLABEL(EXIT); /*RAF-9*/ 00985990
- GEN('ANOP',''); /*RAF-22*/ 00985992
- RETURN; /*RAF-9*/ 00985995
- END CASMSELECT; /*RAF-9*/ 00986000
- 1 00986005
- /* ASM EXIT FROM <SEQSYM> IF <COND> */ /*RAF-9*/ 00986010
- /*RAF-9*/ 00986015
- CASMEXIT: PROCEDURE; /*RAF-9*/ 00986020
- /*RAF-9*/ 00986025
- DECLARE /*RAF-9*/ 00986030
- EXLABEL CHAR(8) VARYING, /*RAF-9*/ 00986035
- I FIXED BIN; /*RAF-9*/ 00986040
- /*RAF-9*/ 00986045
- EXLABEL=''; /*RAF-9*/ 00986050
- IF ASMDOLEV<=0 THEN /*RAF-9*/ 00986055
- CALL ERROR('CASMEXIT-1: NO CONTAINING ASM LOOP'|| /*RAF-9*/ 00986060
- ' STRUCTURE FOR ASM EXIT'); /*RAF-9*/ 00986065
- IF ^RCHECK('FROM') THEN I=ASMDOLEV; /*RAF-9*/ 00986070
- ELSE DO; /*RAF-9*/ 00986075
- CALL RLABEL; /*RAF-9*/ 00986080
- IF WORD='' THEN /*RAF-9*/ 00986085
- CALL ERROR('CASMEXIT-2: MISSING SEQUENCE SYMBOL'|| /*RAF-9*/ 00986090
- ' FOLLOWING "FROM"'); /*RAF-9*/ 00986095
- ELSE IF SUBSTR(WORD,1,1)^='.' THEN /*RAF-9*/ 00986100
- CALL ERROR('CASMEXIT-3: EXIT LABEL MUST BE '|| /*RAF-9*/ 00986105
- 'SEQUENCE SYMBOL'); /*RAF-9*/ 00986110
- DO I=ASMDOLEV BY -1 TO 1 /*RAF-9*/ 00986115
- WHILE(ASMDOLABEL(I)^=WORD); /*RAF-9*/ 00986120
- END; /*RAF-9*/ 00986125
- IF I<1 THEN DO; /*RAF-9*/ 00986130
- CALL ERROR('CASMEXIT-4: EXIT LABEL NOT FOUND'); /*RAF-9*/ 00986135
- I = ASMDOLEV; /*RAF-9*/ 00986140
- END; /*RAF-9*/ 00986145
- END; /*RAF-9*/ 00986150
- IF I>=1 THEN DO; /*RAF-9*/ 00986155
- IF ASMEXID(I)='' THEN ASMEXID(I) = GENSEQSYM; /*RAF-9*/ 00986160
- EXLABEL = ASMEXID(I); /*RAF-9*/ 00986165
- END; /*RAF-9*/ 00986170
- /*RAF-9*/ 00986175
- CALL LABPUSH; CALL LABFLUSH; /*RAF-31*/ 00986178
- IF ^RCHECK('IF') THEN GEN('AGO',EXLABEL); /*RAF-9*/ 00986180
- ELSE DO; /*RAF-9*/ 00986185
- OPANDS=CONDSCAN(#FALSE); /*RAF-9*/ 00986190
- GEN('AIF',OPANDS||EXLABEL); /*RAF-9*/ 00986195
- END; /*RAF-9*/ 00986200
- /*RAF-9*/ 00986205
- RETURN; /*RAF-9*/ 00986210
- END CASMEXIT; /*RAF-9*/ 00986215
- 1 00986220
- /* ASM NEXT OF <SEQSYM> IF <COND> */ /*RAF-9*/ 00986225
- /*RAF-9*/ 00986230
- CASMNEXT: PROCEDURE; /*RAF-9*/ 00986235
- /*RAF-9*/ 00986240
- DECLARE /*RAF-9*/ 00986245
- NXLABEL CHAR(8) VARYING, /*RAF-9*/ 00986250
- I FIXED BIN; /*RAF-9*/ 00986255
- /*RAF-9*/ 00986260
- NXLABEL=''; /*RAF-9*/ 00986265
- IF ASMDOLEV<=0 THEN /*RAF-9*/ 00986270
- CALL ERROR('CASMNEXT-1: NO CONTAINING ASM LOOP'|| /*RAF-9*/ 00986275
- ' STRUCTURE FOR ASM NEXT'); /*RAF-9*/ 00986280
- IF ^RCHECK('OF') THEN I=ASMDOLEV; /*RAF-9*/ 00986285
- ELSE DO; /*RAF-9*/ 00986290
- CALL RLABEL; /*RAF-9*/ 00986295
- IF WORD='' THEN /*RAF-9*/ 00986300
- CALL ERROR('CASMNEXT-2: MISSING SEQUENCE SYMBOL'|| /*RAF-9*/ 00986305
- ' FOLLOWING "OF"'); /*RAF-9*/ 00986310
- ELSE IF SUBSTR(WORD,1,1)^='.' THEN /*RAF-9*/ 00986315
- CALL ERROR('CASMNEXT-3: NEXT LABEL MUST BE '|| /*RAF-9*/ 00986320
- 'SEQUENCE SYMBOL'); /*RAF-9*/ 00986325
- DO I=ASMDOLEV BY -1 TO 1 /*RAF-9*/ 00986330
- WHILE(ASMDOLABEL(I)^=WORD); /*RAF-9*/ 00986335
- END; /*RAF-9*/ 00986340
- IF I<1 THEN DO; /*RAF-9*/ 00986345
- CALL ERROR('CASMNEXT-4: NEXT LABEL NOT FOUND'); /*RAF-9*/ 00986350
- I = ASMDOLEV; /*RAF-9*/ 00986355
- END; /*RAF-9*/ 00986360
- END; /*RAF-9*/ 00986365
- IF I>=1 THEN DO; /*RAF-9*/ 00986370
- IF ASMDOID(I)='' THEN ASMDOID(I) = GENSEQSYM; /*RAF-9*/ 00986375
- NXLABEL = ASMDOID(I); /*RAF-9*/ 00986380
- END; /*RAF-9*/ 00986385
- /*RAF-9*/ 00986390
- CALL LABPUSH; CALL LABFLUSH; /*RAF-31*/ 00986393
- IF ^RCHECK('IF') THEN GEN('AGO',NXLABEL); /*RAF-9*/ 00986395
- ELSE DO; /*RAF-9*/ 00986400
- OPANDS=CONDSCAN(#FALSE); /*RAF-9*/ 00986405
- GEN('AIF',OPANDS||NXLABEL); /*RAF-9*/ 00986410
- END; /*RAF-9*/ 00986415
- /*RAF-9*/ 00986420
- RETURN; /*RAF-9*/ 00986425
- END CASMNEXT; /*RAF-9*/ 00986430
- 1 00986435
- /* ASM GOTO <SEQSYM> IF <COND> */ /*RAF-9*/ 00986440
- /*RAF-9*/ 00986445
- CASMGOTO: PROCEDURE; /*RAF-9*/ 00986450
- /*RAF-9*/ 00986455
- DECLARE LABEL CHAR(8) VARYING STATIC; /*RAF-9*/ 00986460
- /*RAF-9*/ 00986465
- CALL RLABEL; /*RAF-9*/ 00986470
- LABEL = WORD; /*RAF-9*/ 00986475
- IF LABEL = '' /*RAF-9*/ 00986480
- THEN CALL ERROR('CASMGOTO-1: MISSING SEQUENCE SYMBOL'); /*RAF-9*/ 00986485
- ELSE IF SUBSTR(LABEL,1,1)^='.' /*RAF-9*/ 00986490
- THEN CALL ERROR('CASMGOTO-2: ILLEGAL SEQUENCE SYMBOL'); /*RAF-9*/ 00986495
- /*RAF-9*/ 00986500
- CALL LABPUSH; CALL LABFLUSH; /*RAF-9*/ 00986505
- /*RAF-9*/ 00986510
- IF RCHECK('IF') /*RAF-9*/ 00986515
- THEN GEN('AIF',CONDSCAN(#FALSE)||LABEL); /*RAF-9*/ 00986520
- ELSE GEN('AGO',LABEL); /*RAF-9*/ 00986525
- /*RAF-9*/ 00986530
- RETURN; /*RAF-9*/ 00986535
- END CASMGOTO; /*RAF-9*/ 00986540
- 1 00986545
- ESQUISH: /*RAF-9*/ 00986550
- PROCEDURE; 00987000
- DCL 00988000
- (I,J) FIXED BIN; 00989000
- 00990000
- J = 0; 00991000
- DO I = 1 TO EQVLEV; 00992000
- IF EQVSTK(I,1) ^= '' THEN 00993000
- DO; 00994000
- J = J+1; 00995000
- EQVSTK(J,1) = EQVSTK(I,1); 00996000
- EQVSTK(J,2) = EQVSTK(I,2); 00997000
- END; 00998000
- END; 00999000
- EQVLEV = J; 01000000
- RETURN; 01001000
- END ESQUISH; 01002000
- 01003000
- /* END CASMIF; */ /*RAF-8*/ 01004000
- 1 01004010
- /* PROCEDURE TO FIND LABEL FOR ASM LOOP CONSTRUCT */ /*RAF-9*/ 01004020
- /*RAF-9*/ 01004030
- CURSEQSYM: PROCEDURE RETURNS(CHAR(8) VARYING); /*RAF-9*/ 01004040
- /*RAF-9*/ 01004050
- DECLARE CLABEL CHAR(8) VARYING; /*RAF-9*/ 01004060
- /*RAF-9*/ 01004070
- CLABEL = ''; /*RAF-9*/ 01004080
- IF SUBSTR(C_LABEL,1,1)='.' & SUBSTR(C_LABEL,2,1)^='@' /*RAF-9*/ 01004090
- THEN CLABEL = C_LABEL; /*RAF-9*/ 01004100
- ELSE IF C_LABEL=' ' & LABLEV>0 THEN DO; /*RAF-9*/ 01004110
- IF SUBSTR(LABSTK(LABLEV),1,1)='.' & /*RAF-9*/ 01004120
- SUBSTR(LABSTK(LABLEV),2,1)^='@' /*RAF-9*/ 01004130
- THEN CLABEL = LABSTK(LABLEV); /*RAF-9*/ 01004140
- END; /*RAF-9*/ 01004150
- /*RAF-9*/ 01004160
- RETURN(CLABEL); /*RAF-9*/ 01004170
- END CURSEQSYM; /*RAF-9*/ 01004180
- 1 01004190
- /* PROCEDURE TO SCAN FOR STATEMENT IN ASM CONSTRUCT */ /*RAF-9*/ 01004200
- /*RAF-9*/ 01004210
- ASMSTMNT: PROCEDURE RECURSIVE; /*RAF-9*/ 01004220
- /*RAF-9*/ 01004230
- DCL ELEV FIXED BIN; /*RAF-9*/ 01004240
- /*RAF-9*/ 01004250
- CALL ESQUISH; /*RAF-9*/ 01004260
- ELEV = EQVLEV+1; /*RAF-9*/ 01004270
- CALL STMNT; /*RAF-9*/ 01004280
- CALL LABPUSH; /*RAF-9*/ 01004290
- CALL LABFLUSH; /*RAF-9*/ 01004300
- CALL EQVFLUSH(#FALSE,ELEV); /*RAF-9*/ 01004310
- END ASMSTMNT; /*RAF-9*/ 01004320
- 1 01005000
- /* MACRO (&L:) <MACRO NAME> (<PARAMETER LIST>); 01006000
- <BODY> 01007000
- MEND */ 01008000
- 01009000
- CMACRO: PROCEDURE; 01010000
- DCL 01011000
- (MLABEL,MNAME) CHAR(8) VARYING, 01012000
- (I,L,ELEV) FIXED BIN, /*RAF-8*/ 01013000
- DEFTYPE CHAR(8) VARYING, DEFS(7) CHAR(8) VAR 01014000
- INIT('GBLA','GBLB','GBLC','LCLA','LCLB','LCLC','COPY'); 01015000
- 01016000
- IN_MACRO = #TRUE; 01017000
- MLABEL = ''; 01018000
- IF RCHAR('&') THEN 01019000
- DO; 01020000
- IF ^RCHAR('&') THEN 01021000
- CALL ERROR('CMACRO: "&" INSERTED.'); 01022000
- CALL RWORD; 01023000
- IF WORDAL THEN 01024000
- MLABEL = '&'||WORD; 01025000
- ELSE 01026000
- CALL ERROR('CMACRO: INVALID MACRO LABEL.'); 01027000
- IF ^RCHAR(':') THEN 01028000
- CALL ERROR('CMACRO: ":" ASSUMED AFTER "'|| 01029000
- MLABEL||'".'); 01030000
- END; 01031000
- CALL RWORD; 01032000
- IF WORDAL THEN 01033000
- MNAME = WORD; 01034000
- ELSE 01035000
- DO; 01036000
- MNAME = '???'; 01037000
- CALL ERROR('CMACRO: MISSING MACRO NAME.'); 01038000
- END; 01039000
- CALL ROPANDS(#FALSE); /*RAF-9*/ 01040000
- IF ^RCHAR(';') THEN 01041000
- CALL ERROR('CMACRO: MISSING SEMICOLON INSERTED.'); 01042000
- CALL LABPUSH; 01043000
- C_DATA = ' '; 01044000
- GEN('MACRO',''); 01045000
- C_LABEL = MLABEL; 01046000
- C_OPERATION = MNAME; 01047000
- GEN_OPERANDS(OPANDS); 01048000
- 1 01049000
- NESTLEV = NESTLEV+1; 01050000
- NESTID(NESTLEV) = CIN_ID; 01051000
- DEFTYPE = '?'; 01052000
- DO WHILE(DEFTYPE^=''); 01053000
- DEFTYPE = ''; 01054000
- DO I=1 TO 7 WHILE(^RCHECK(DEFS(I))); 01055000
- END; 01056000
- IF I<8 THEN 01057000
- DO; 01058000
- DEFTYPE,WORD = DEFS(I); 01059000
- CALL ALCSTMT; 01060000
- IF ^RCHAR(';') THEN 01061000
- CALL ERROR('CMACRO: MISSING SEMICOLON INSERTED.'); 01062000
- END; 01063000
- END; 01064000
- GEN('LCLC','&@'); 01065000
- C_LABEL = '&@'; 01066000
- GEN('SETC','''&SYSNDX'''); 01067000
- CALL ESQUISH; /*RAF-8*/ 01067100
- ELEV = EQVLEV+1; /*RAF-8*/ 01067200
- DO WHILE(IN_MACRO); 01068000
- IF RCHECK('MEND') THEN IN_MACRO = #FALSE; /*RAF-8*/ 01068100
- ELSE IF RCHECK('ENDMACRO') THEN IN_MACRO = #FALSE; /*RAF-8*/ 01068200
- ELSE DO; /*RAF-8*/ 01069000
- CALL STMNT; /*RAF-8*/ 01070000
- IF ^RCHAR(';') THEN 01071000
- CALL ERROR('CMACRO: MISSING SEMICOLON INSERTED.'); 01072000
- END; /*RAF-8*/ 01072500
- END; 01073000
- NESTLEV = NESTLEV-1; 01074000
- IF NESTLEV=0 THEN PREDLABLEV=0; /*RAF-6*/ 01074500
- CALL LABPUSH; /*RAF-8*/ 01074600
- CALL LABFLUSH; /*RAF-8*/ 01074700
- CALL EQVFLUSH(#FALSE,ELEV); /*RAF-8*/ 01074800
- GEN('MEND',''); /*RAF-8*/ 01074900
- RETURN; 01075000
- END CMACRO; 01076000
- 1 01077000
- /* BAL; 01078000
- <BAL CODING> 01079000
- ALP; */ 01080000
- 01081000
- CBAL: 01082000
- PROCEDURE; 01083000
- DCL 01084000
- 1 BALCOM STATIC, 01085000
- 2 ASTR CHAR(3) INIT('* '), /*RAF-45*/ 01086000
- 2 COMFLD CHAR(69), /*RAF-45*/ 01087000
- 2 COMID CHAR(8); 01088000
- 01089000
- CALL LABPUSH; 01090000
- CALL LABFLUSH; 01091000
- INAL = 0; 01092000
- DO WHILE(#TRUE) ; 01093000
- COL = 80; 01094000
- CHAR = ' '; 01095000
- CALL RWORD; 01096000
- IF WORD = 'ALP' & CHAR = ';' THEN 01097000
- DO ; 01098000
- INAL = 1 ; 01099000
- IF IN_MACRO THEN ASTR='.*'; ELSE ASTR='*'; /*RAF-45*/ 01099500
- COMFLD = SUBSTR(CARDIN,1,69) ; /*RAF-45*/ 01100000
- COMID = CIN_ID ; 01101000
- WRITE FILE(SYSOUT) FROM(BALCOM) ; 01102000
- RETURN ; 01103000
- END ; 01104000
- WRITE FILE(SYSOUT) FROM (CARDIN); 01105000
- END; 01106000
- END CBAL ; 01107000
- 1 01107010
- /* COMMENT; */ /*RAF-10*/ 01107020
- /* <TEXT OF COMMENT> */ /*RAF-10*/ 01107030
- /* ALP; */ /*RAF-10*/ 01107040
- /*RAF-10*/ 01107050
- CCOMMENT: PROCEDURE; /*RAF-10*/ 01107060
- /*RAF-10*/ 01107070
- DCL /*RAF-10*/ 01107080
- 1 BALCOM STATIC, /*RAF-10*/ 01107090
- 2 ASTR CHAR(2) INIT('* '), /*RAF-10*/ 01107100
- 2 COMFLD CHAR(70), /*RAF-10*/ 01107110
- 2 COMID CHAR(8); /*RAF-10*/ 01107120
- /*RAF-10*/ 01107130
- CALL LABPUSH; CALL LABFLUSH; /*RAF-10*/ 01107140
- INAL = 0; /*RAF-10*/ 01107150
- DO WHILE(#TRUE); /*RAF-10*/ 01107160
- COL = 80; CHAR = ' '; /*RAF-10*/ 01107170
- CALL RWORD; /*RAF-10*/ 01107180
- /*RAF-10*/ 01107190
- COMFLD = SUBSTR(CARDIN,1,70); /*RAF-10*/ 01107200
- COMID = CIN_ID; /*RAF-10*/ 01107210
- WRITE FILE(SYSOUT) FROM(BALCOM); /*RAF-10*/ 01107220
- /*RAF-10*/ 01107230
- IF WORD='ALP' & CHAR=';' THEN DO; /*RAF-10*/ 01107240
- INAL = 1; /*RAF-10*/ 01107250
- RETURN; /*RAF-10*/ 01107260
- END; /*RAF-10*/ 01107270
- END; /*RAF-10*/ 01107280
- /*RAF-10*/ 01107290
- END CCOMMENT; /*RAF-10*/ 01107300
- 1 /*RAF-36*/ 01107310
- /* DATA <STATEMENT> */ /*RAF-36*/ 01107320
- /*RAF-36*/ 01107330
- CDATA: PROCEDURE RECURSIVE; /*RAF-36*/ 01107340
- DCL AROUND CHAR(8) VARYING; /*RAF-36*/ 01107350
- /*RAF-36*/ 01107360
- AROUND = GENSYM; /*RAF-36*/ 01107370
- GEN('B',AROUND); /*RAF-36*/ 01107380
- CALL STMNT; /*RAF-36*/ 01107390
- CALL WLABEL(AROUND); /*RAF-36*/ 01107400
- END CDATA; /*RAF-36*/ 01107410
- 1 01108000
- /* SELECT; 01109000
- <SELECT LIST> 01110000
- ENDSEL */ 01111000
- 01112000
- CSELECT: 01113000
- PROCEDURE RECURSIVE; 01114000
- DECLARE 01115000
- (CASEBODY,NEXTCASE,CLABELB,CLABELE) CHAR(8) VARYING, 01116000
- EXIT CHAR(8) VARYING, /*RAF-8*/ 01116500
- (CHKFIRST,SELEND) BIT(1); 01117000
- 01118000
- CALL SWLABEL(CLABELB); 01119000
- DOLEV = DOLEV+1; 01120000
- DOID(DOLEV) = CLABELB; 01121000
- DOLABEL(DOLEV) = CURLAB; 01122000
- NESTLEV = NESTLEV+1; 01123000
- NESTID(NESTLEV) = CIN_ID; 01124000
- 01125000
- CHKFIRST = RCHECK('FIRST'); 01126000
- IF CHKFIRST THEN 01127000
- CLABELE = GENSYM; 01128000
- ELSE 01129000
- CLABELE = ''; 01130000
- EXID(DOLEV) = ''; /*RAF-8*/ 01131000
- IF ^RCHAR(';') THEN 01132000
- CALL ERROR('CSELECT: MISSING SEMICOLON INSERTED.'); 01133000
- 01134000
- NEXTCASE = ''; /*RAF-4*/ 01134900
- SELEND = RCHECK('ENDSEL'); 01135000
- DO WHILE(^SELEND); 01136000
- CASEBODY = ''; 01137000
- NEXTCASE = GENSYM; 01138000
- CALL PREDICATE(CASEBODY,NEXTCASE,@OUTER_PREDICATE,#DUMMY, 01139000
- @USE_TRUTH,#DUMMY,@B); 01140000
- IF ^RCHAR(':') THEN 01141000
- CALL ERROR('CSELECT: MISSING COLON INSERTED.'); 01142000
- CALL STMNT; 01143000
- IF ^RCHAR(';') THEN 01144000
- CALL ERROR('CSELECT: MISSING SEMICOLON INSERTED.'); 01145000
- SELEND = RCHECK('ENDSEL'); 01146000
- IF CHKFIRST & ^SELEND THEN 01147000
- GEN('B',CLABELE); 01148000
- IF ^SELEND THEN 01149000
- CALL WLABEL(NEXTCASE); 01150000
- END; /*RAF-4*/ 01151000
- 1 01152000
- NESTLEV = NESTLEV-1; /*RAF-8*/ 01152500
- IF RCHECK('ELSE') THEN 01153000
- DO; 01154000
- IF ^CHKFIRST THEN 01155000
- CALL ERROR('CSELECT: "ELSE" ILLEGAL WITHOUT "FIRST"'|| 01156000
- ' OPTION ON "SELECT" STATEMENT'); 01157000
- IF NEXTCASE^='' THEN DO; /*RAF-4*/ 01157500
- IF CLABELE='' THEN /*RAF-8*/ /*RAF-4*/ 01158000
- CLABELE = GENSYM; /*RAF-8*/ /*RAF-4*/ 01159000
- GEN('B',CLABELE); /*RAF-8*/ /*RAF-4*/ 01160000
- CALL WLABEL(NEXTCASE); /*RAF-4*/ 01161000
- END; /*RAF-4*/ 01161500
- CALL STMNT; 01162000
- END; 01163000
- ELSE 01164000
- CALL CWLABEL(NEXTCASE); 01165000
- 01166000
- EXIT = EXID(DOLEV); /*RAF-8*/ 01166100
- DOLEV = DOLEV-1; /*RAF-8*/ 01166200
- CALL CWLABEL(CLABELE); /*RAF-8*/ 01166300
- IF RCHECK('THEN') THEN CALL STMNT; /*RAF-8*/ 01166400
- CALL CWLABEL(EXIT); /*RAF-8*/ 01167000
- /* DOLEV = DOLEV-1; */ /*RAF-8*/ 01168000
- /* NESTLEV = NESTLEV-1; */ /*RAF-8*/ 01169000
- IF NESTLEV=0 THEN PREDLABLEV=0; /*RAF-6*/ 01169500
- RETURN; 01170000
- END CSELECT; 01171000
- 1 01172000
- ALCSTMT: PROCEDURE; 01173000
- DCL 01174000
- ( BLANKS72 CHAR(72) INIT(' '), 01175000
- L FIXED BIN, 01176000
- TLABEL CHAR(8) ) STATIC; 01177000
- DCL 01178000
- SPECOPS(39) CHAR(8) VAR STATIC INIT( 01179000
- 'DC','DS','CSECT','DSECT','COM', 01180000
- 'TITLE','LTORG','CNOP', 01181000
- 'DROP','USING','ENTRY', 01182000
- 'SUBTITLE','PRINT','EJECT','SPACE', 01183000
- 'ICTL','ISEQ','PUNCH','REPRO', 01184000
- 'ORG','COPY','END', 01185000
- 'MACRO','MEND','MNOTE','AIF','ANOP','AGO','ACTR','MEXIT', 01186000
- 'GBLA','GBLB','GBLC','LCLA','LCLB','LCLC','SETA','SETB','SETC' 01187000
- ); 01188000
- 01189000
- IF C_LABEL=' ' & LABLEV>0 THEN 01190000
- DO; 01191000
- C_LABEL = LABSTK(LABLEV); 01192000
- LABLEV = LABLEV-1; 01193000
- END; 01194000
- IF C_LABEL^=' ' THEN 01195000
- DO; 01196000
- DO L=39 TO 1 BY -1 WHILE(WORD^=SPECOPS(L)); 01197000
- END; 01198000
- IF (L>0 & SUBSTR(C_LABEL,1,1)='@') | 01199000
- (L>8 & SUBSTR(C_LABEL,1,1)^='&') THEN 01200000
- CALL LABPUSH; 01201000
- END; 01202000
- TLABEL = C_LABEL; 01203000
- CALL ROPANDS(#FALSE); /*RAF-9*/ 01204000
- IF WORD ^= 'CC' THEN 01205000
- DO ; 01206000
- C_OPERATION = WORD ; 01207000
- IF IN_MACRO THEN 01208000
- /* IF C_OPERATION = 'MEND' THEN */ /*RAF-8*/ 01209000
- /* IN_MACRO = #FALSE; */ /*RAF-8*/ 01210000
- /* ELSE */ /*RAF-8*/ 01211000
- IF C_OPERATION = 'SPACE' THEN 01212000
- DO; 01213000
- C_DATA = '.*'; 01214000
- OPANDS = ''; 01215000
- END; 01216000
- 01217000
- IF WORD='SUBTITLE' THEN 01218000
- DO; 01219000
- C_OPERATION = 'TITLE' ; 01220000
- SUBTITL = #TRUE; 01221000
- SUBTITLE = SUBSTR(BLANKS72,1,(73-LENGTH(OPANDS)-2)/2) 01222000
- ||SUBSTR(OPANDS,2,LENGTH(OPANDS)-2); 01223000
- END; 01224000
- 01225000
- GEN_OPERANDS(OPANDS); 01226000
- END ; 01227000
- 1 01228000
- IF WORD = 'SPACE' THEN 01229000
- PUT SKIP(2) FILE(SYSPRINT); 01230000
- ELSE 01231000
- IF WORD='TITLE' | WORD='EJECT' THEN 01232000
- DO; 01233000
- IF WORD='TITLE' THEN 01234000
- DO; 01235000
- DECKNAME = TLABEL; 01236000
- TITLE = SUBSTR(BLANKS72,1,(73-LENGTH(OPANDS)-2)/2) 01237000
- ||SUBSTR(OPANDS,2,LENGTH(OPANDS)-2); 01238000
- END; 01239000
- SIGNAL ENDPAGE(SYSPRINT); 01240000
- END; 01241000
- INAL = 1 ; 01242000
- RETURN; 01243000
- END ALCSTMT; 01244000
- 1 01245000
- /* GENERATE CODE FOR PREDICATES */ 01246000
- PREDICATE: 01247000
- PROCEDURE(THRULABEL,BRLABEL,OUTER,PREDFOUND,GLOBALNEG,HANGNOT,BTYPE) 01248000
- RECURSIVE; 01249000
- 01250000
- /* THRULABEL = FALL-THROUGH LABEL 01251000
- BRLABEL = BRANCH LABEL 01252000
- OUTER=#TRUE => PREDICATE IS AN OUTER ONE 01253000
- PREDFOUND => SET IF WE FIND WE ARE IN A PREDICATE, ELSE FALSE 01254000
- GLOBALNEG=#TRUE => GLOBAL NEGATION OF PREDICATE 01255000
- BTYPE=#TRUE => BR FORM */ 01256000
- 01257000
- DCL (THRULABEL,BRLABEL) CHAR(*) VARYING, 01258000
- (OUTER,PREDFOUND,GLOBALNEG,HANGNOT,BTYPE) BIT(1); 01259000
- DCL (BTRUTH,PREDNEST,ANDFLG,ORFLG) BIT(1), 01260000
- (THRULAB,BRLAB) CHAR(8) VARYING, 01261000
- PREDID CHAR(8); 01262000
- 01263000
- PREDFOUND = #FALSE; 01264000
- THRULAB,BRLAB = ''; 01265000
- 01266000
- BTRUTH = ^GLOBALNEG; 01267000
- DO WHILE(RCHAR('^')); 01268000
- BTRUTH = ^BTRUTH; 01269000
- PREDFOUND = #TRUE; 01270000
- END; 01271000
- 01272000
- IF ^RCHAR('<') THEN 01273000
- CALL STMNT; 01274000
- ELSE 01275000
- DO; 01276000
- NESTLEV = NESTLEV+1; NESTID(NESTLEV) = CIN_ID; /*RAF-28*/ 01276500
- PREDID = CIN_ID; 01277000
- CALL PREDICATE(THRULAB,BRLAB,@INNER_PREDICATE,PREDNEST, 01278000
- ^BTRUTH,HANGNOT,BTYPE); 01279000
- IF ^PREDNEST THEN 01280000
- DO; 01281000
- IF RCHAR(';') THEN 01282000
- DO; 01283000
- NESTLEV = NESTLEV-1; /*RAF-28*/ 01283500
- CALL GROUP(#FALSE,PREDID); 01284000
- GOTO PREDTST; 01285000
- END; 01286000
- ELSE 01287000
- IF ^RCHAR('>') THEN 01288000
- DO; 01289000
- CALL ERROR('CPRED: MISSING SEMICOLON INSERTED.');01290000
- NESTLEV = NESTLEV-1; /*RAF-28*/ 01290500
- CALL GROUP(#FALSE,PREDID); 01291000
- GOTO PREDTST; 01292000
- END; 01293000
- ELSE DO; /*RAF-28*/ 01293100
- NESTLEV = NESTLEV-1; /*RAF-28*/ 01293200
- IF NESTLEV=0 THEN PREDLABLEV=0; /*RAF-28*/ 01293300
- END; /*RAF-28*/ 01293400
- END; 01294000
- ELSE 01295000
- DO; 01296000
- PREDFOUND = #TRUE; 01297000
- IF ^RCHAR('>') THEN 01298000
- CALL ERROR('CPRED: MISSING ">" INSERTED.'); 01299000
- ELSE DO; /*RAF-28*/ 01299100
- NESTLEV = NESTLEV-1; /*RAF-28*/ 01299200
- IF NESTLEV=0 THEN PREDLABLEV=0; /*RAF-28*/ 01299300
- END; /*RAF-28*/ 01299400
- END; 01300000
- END; 01301000
- 1 01302000
- PREDTST: 01303000
- ANDFLG,ORFLG = #FALSE; 01304000
- IF RCHAR('&') THEN 01305000
- IF GLOBALNEG THEN ORFLG = #TRUE; 01306000
- ELSE ANDFLG = #TRUE; 01307000
- ELSE 01308000
- IF RCHAR('|') THEN 01309000
- IF GLOBALNEG THEN ANDFLG = #TRUE; 01310000
- ELSE ORFLG = #TRUE; 01311000
- IF ANDFLG THEN 01312000
- DO; 01313000
- PREDFOUND = #TRUE; 01314000
- CALL GB(^XOR(BTRUTH,HANGNOT),BRLABEL,BTYPE); 01315000
- HANGNOT = #FALSE; 01316000
- CALL EQU(BRLAB,BRLABEL); 01317000
- CALL CWLABEL(THRULAB); 01318000
- CALL PREDICATE(THRULABEL,BRLABEL,OUTER,#DUMMY,GLOBALNEG,HANGNOT, 01319000
- BTYPE); 01320000
- END; 01321000
- ELSE 01322000
- IF ORFLG THEN 01323000
- DO; 01324000
- PREDFOUND = #TRUE; 01325000
- CALL GB(XOR(BTRUTH,HANGNOT),THRULABEL,BTYPE); 01326000
- HANGNOT = #FALSE; 01327000
- CALL EQU(THRULAB,THRULABEL); 01328000
- CALL CWLABEL(BRLAB); 01329000
- CALL PREDICATE(THRULABEL,BRLABEL,OUTER,#DUMMY,GLOBALNEG, 01330000
- HANGNOT,BTYPE); 01331000
- END; 01332000
- ELSE 01333000
- DO; 01334000
- IF THRULABEL='' & THRULAB^='' THEN 01335000
- DO; 01336000
- THRULABEL = THRULAB; 01337000
- THRULAB = ''; 01338000
- END; 01339000
- IF BRLABEL='' & BRLAB^='' THEN 01340000
- DO; 01341000
- BRLABEL = BRLAB; 01342000
- BRLAB = ''; 01343000
- END; 01344000
- CALL EQU(THRULAB,THRULABEL); 01345000
- CALL EQU(BRLAB,BRLABEL); 01346000
- IF OUTER THEN 01347000
- DO; 01348000
- CALL GB(^XOR(BTRUTH,HANGNOT),BRLABEL,BTYPE); 01349000
- HANGNOT = #FALSE; 01350000
- CALL CWLABEL(THRULABEL); 01351000
- END; 01352000
- ELSE 01353000
- HANGNOT = HANGNOT | XOR(BTRUTH,^GLOBALNEG); 01354000
- END; 01355000
- 01356000
- RETURN; 01357000
- 1 01358000
- EQU: PROCEDURE(L1,L2); 01359000
- DCL (L1,L2) CHAR(*) VARYING; 01360000
- DCL ( (I,PREVOP) FIXED BIN, 01361000
- REG_DISP BIT(1) ) STATIC; 01362000
- 01363000
- PREVOP = 0; 01364000
- IF L2^='' THEN IF SUBSTR(L2,LENGTH(L2),1)=')' THEN /*RAF-3*/ 01365000
- DO I=1 TO LENGTH(L2); 01366000
- IF SUBSTR(L2,I,1)='(' & PREVOP=0 THEN 01367000
- DO; 01368000
- REG_DISP = #TRUE; 01369000
- GOTO PREDLABCHK; 01370000
- END; 01371000
- PREVOP = INDEX('+-*/',SUBSTR(L2,I,1)); 01372000
- END; 01373000
- REG_DISP = #FALSE; 01374000
- 01375000
- PREDLABCHK: 01376000
- DO I=PREDLABLEV TO 1 BY -1 WHILE(L1^=PREDLABSTK(I,2)); 01377000
- END; 01378000
- IF I>0 THEN 01379000
- REG_DISP = PREDBTYPE(I)='R'; 01380000
- IF I=0 | ^REG_DISP THEN 01381000
- DO; 01382000
- IF L1^='' & L2^='' THEN 01383000
- CALL EQVADD((L1),(L2)); 01384000
- END; 01385000
- ELSE 01386000
- DO; 01387000
- CALL WLABEL(L1); 01388000
- GEN('DS','0H'); 01389000
- GEN('ORG',PREDLABSTK(I,1)||'+2'); 01390000
- IF PREDBTYPE(I)='R' THEN 01391000
- GEN('DC','S(0('||L2||'))'); 01392000
- ELSE 01393000
- GEN('DC','S('||L2||')'); 01394000
- GEN('ORG',L1); 01395000
- END; 01396000
- 01397000
- IF I>0 THEN 01398000
- DO; 01399000
- DO I=I+1 TO PREDLABLEV; 01400000
- PREDLABSTK(I-1,1) = PREDLABSTK(I,1); 01401000
- PREDLABSTK(I-1,2) = PREDLABSTK(I,2); 01402000
- END; 01403000
- PREDLABLEV = PREDLABLEV-1; 01404000
- END; 01405000
- RETURN; 01406000
- END EQU; 01407000
- 01408000
- XOR: PROCEDURE(B1,B2) RETURNS(BIT(1)); 01409000
- DCL (B1,B2) BIT(1); 01410000
- RETURN((B1 & ^B2) | (^B1 & B2)); 01411000
- END XOR; 01412000
- 01413000
- /* END PREDICATE; */ /*RAF-6*/ 01414000
- 1 01415000
- GB: 01416000
- PROCEDURE (B,LABLST,BRT); 01417000
- /* GENERATE CONDITIONAL BRANCH (ON TRUTH IF B) TO LABLST */ 01418000
- DCL 01419000
- (B,BRT) BIT(1), 01420000
- LABLST CHAR(*) VARYING; 01421000
- DCL 01422000
- LABLADDR CHAR(8) VARYING STATIC, /*RAF-41*/ 01423000
- (I,J) FIXED BIN STATIC, /*RAF-41*/ 01424000
- CCCODE CHAR(8) STATIC, /*RAF-41*/ 01425000
- CCODE FIXED BIN STATIC; /*RAF-41*/ 01426000
- /*RAF-41*/ 01426100
- CCODE = 0; /*RAF-41*/ 01426200
- 01427000
- IF LABLST='' THEN 01428000
- DO; 01429000
- CALL SWLABEL(LABLADDR); 01430000
- PREDLABLEV = PREDLABLEV+1; 01431000
- PREDLABSTK(PREDLABLEV,1) = LABLADDR; 01432000
- LABLST = GENSYM; 01433000
- PREDLABSTK(PREDLABLEV,2) = LABLST; 01434000
- IF BRT THEN 01435000
- PREDBTYPE(PREDLABLEV) = 'R'; 01436000
- ELSE 01437000
- PREDBTYPE(PREDLABLEV) = ''; 01438000
- END; 01439000
- 01440000
- IF WORD = 'CC' THEN 01441000
- DO; 01442000
- IF LENGTH(OPANDS)>8 THEN 01443000
- CALL ERROR('GB: CONDITION CODE STRING TOO LONG.'); 01444000
- CCCODE = OPANDS; 01445000
- END; 01446000
- ELSE 01447000
- DO; 01448000
- DO I = 1 TO 17 WHILE(PREDICATES(I,1) ^= WORD); 01449000
- END; 01450000
- CCCODE = PREDICATES(I,2); 01451000
- END; 01452000
- 1 01453000
- /* CCCODE IS NOW A SET OF MNEMONIC COND CODE CHARACTERS */ 01454000
- DO I = 1 TO 8; /* FOR EACH CHAR .. */ 01455000
- J = INDEX(CCTAB.LET, SUBSTR(CCCODE, I, 1)); 01456000
- IF J = 0 THEN 01457000
- CALL 01458000
- ERROR('UNDEF COND CODE CHAR: ' || SUBSTR(CCCODE,I,1) ); 01459000
- ELSE 01460000
- CCODE = CCODE+CCTAB.IVAL(J); 01461000
- END; 01462000
- IF INDEX(CCCODE, 'N') | INDEX(CCCODE,'^') THEN 01463000
- CCODE = 15-CCODE; 01464000
- IF ^B THEN 01465000
- CCODE = 15-CCODE; 01466000
- SUBSTR(CARDOUT,10,10) = OPTAB(CCODE+1); 01467000
- IF BRT & SUBSTR(LABLST,1,1)^='@' THEN 01468000
- IF SUBSTR(C_OPERATION,3,1)=' ' THEN 01469000
- SUBSTR(C_OPERATION,3,1)='R'; 01470000
- ELSE 01471000
- SUBSTR(C_OPERATION,4,1)='R'; 01472000
- C_OPERANDS = LABLST; 01473000
- CALL WFLUSH; 01474000
- RETURN; 01475000
- 01476000
- END GB; 01477000
- END PREDICATE; /*RAF-6*/ 01477500
- 1 01478000
- /* WRITE LABEL */ 01479000
- WLABEL: 01480000
- PROCEDURE (ALABL); 01481000
- DCL 01482000
- ALABL CHAR(*) VARYING; 01483000
- DCL 01484000
- I FIXED BIN STATIC; 01485000
- 01486000
- GOTO WLABELX; 01487000
- 0 01488000
- SWLABEL: 01489000
- ENTRY(ALABL); 01490000
- 01491000
- IF C_LABEL ^= ' ' THEN 01492000
- ALABL = C_LABEL; 01493000
- ELSE 01494000
- IF LABLEV>0 THEN 01495000
- ALABL = LABSTK(LABLEV); 01496000
- ELSE 01497000
- ALABL = ''; 01498000
- IF ALABL^='' THEN IF SUBSTR(ALABL,1,1)^='.' THEN /*RAF-3*/ 01499000
- RETURN; 01500000
- /* ELSE */ /*RAF-3*/ 01501000
- DO; 01502000
- ALABL = GENSYM; 01503000
- GOTO WLABELX; 01504000
- END; 01505000
- 0 01506000
- CWLABEL: 01507000
- ENTRY(ALABL); 01508000
- 01509000
- IF ALABL='' THEN RETURN; 01510000
- 0 01511000
- WLABELX: IF C_LABEL ^= ' ' THEN 01512000
- DO; /* LABEL ALREADY IN BUFFER */ 01513000
- LABLEV = LABLEV+1; 01514000
- LABSTK(LABLEV) = C_LABEL; 01515000
- END; 01516000
- DO I = 1 TO EQVLEV; 01517000
- IF EQVSTK(I,2) = ALABL THEN 01518000
- DO; 01519000
- LABLEV = LABLEV+1; 01520000
- LABSTK(LABLEV) = EQVSTK(I,1); 01521000
- EQVSTK(I,*) = ''; 01522000
- END; 01523000
- END; 01524000
- C_LABEL = ALABL ; 01525000
- IF COL_1^='&' & COL_1^='.' THEN /*RAF-12*/ 01526000
- DO; 01527000
- SYMLEV = SYMLEV+1; 01528000
- SYMSTK(SYMLEV) = ALABL; 01529000
- END; 01530000
- CALL PERPUSH; 01531000
- RETURN; 01532000
- END WLABEL ; 01533000
- 1 01534000
- /* FLUSH OUTPUT LINE */ 01535000
- WFLUSH: 01536000
- PROCEDURE ; 01537000
- DCL ( (I,J) FIXED BIN, 01538000
- (FLUSH,LAST_WAS_BRANCH,NOWRITE) BIT(1), 01539000
- TLABEL CHAR(8) VARYING, 01540000
- CH CHAR(1) ) STATIC; 01541000
- 01542000
- IF C_OPERATION='ANOP' & C_LABEL='' THEN RETURN; /*RAF-29*/ 01542100
- /*RAF-29*/ 01542200
- LAST_WAS_BRANCH = BRANCH_LAST; 01543000
- BRANCH_LAST,NOWRITE = #FALSE; 01544000
- IF REQFLUSH(C_OPERATION) THEN 01545000
- DO; 01546000
- FLUSH = #TRUE; 01547000
- IF C_OPERATION = 'B' THEN 01548000
- DO; 01549000
- DO I = 1 TO 52 /*RAF-41*/ 01550000
- WHILE(ALPHANUM(SUBSTR(C_OPERANDS,I,1))); /*RAF-41*/ 01550100
- END; 01551000
- CH = SUBSTR(C_OPERANDS,I,1); 01552000
- IF (I>1 & I<=9) & 01553000
- (CH = ' ' | CH = ';' | CH = '%' | CH = '>') THEN 01554000
- DO; /* BRANCH TO SIMPLE LABEL */ 01555000
- FLUSH = #FALSE; 01556000
- BRANCH_LAST = #TRUE; 01557000
- IF C_LABEL = ' ' & LABLEV>0 THEN DO; /*RAF-2*/ 01557100
- C_LABEL = LABSTK(LABLEV); /*RAF-2*/ 01557200
- LABLEV = LABLEV-1; /*RAF-2*/ 01557300
- END; /*RAF-2*/ 01557400
- IF C_LABEL ^= ' ' & (^IN_MACRO /*RAF-43*/ 01558000
- | SUBSTR(C_OPERANDS,1,1)='@') /*RAF-43*/ 01558500
- THEN DO; /*RAF-43*/ 01559000
- LABLEV = LABLEV+1; 01560000
- LABSTK(LABLEV) = C_LABEL; 01561000
- TLABEL = SUBSTR(C_OPERANDS,1,I-1); 01562000
- DO I=LABLEV TO 1 BY -1 01563000
- WHILE(LABSTK(I)^=TLABEL); 01564000
- END; 01565000
- IF I>0 THEN 01566000
- DO; 01567000
- LABLEV = LABLEV-1; 01568000
- CALL LABFLUSH; 01569000
- END; 01570000
- ELSE 01571000
- DO; 01572000
- C_LABEL = ' '; 01573000
- DO J = 1 TO LABLEV; 01574000
- CALL EQVADD((LABSTK(J)),(TLABEL)); 01575000
- END; 01576000
- LABLEV = 0; 01577000
- END; 01578000
- END; 01579000
- NOWRITE = LAST_WAS_BRANCH & ^LABEL_WRITTEN ; 01580000
- END; 01581000
- END; 01582000
- IF FLUSH THEN 01583000
- CALL LABFLUSH; 01584000
- END; 01585000
- 1 01586000
- IF ^NOWRITE THEN 01587000
- WRITE FILE(SYSOUT) FROM(CARDOUT) ; 01588000
- LABEL_WRITTEN = #FALSE; 01589000
- C_DATA = ' '; 01590000
- IF INAL = 2 THEN 01591000
- INAL = 1 ; 01592000
- RETURN; 01593000
- 01594000
- /* PROCEDURE TO SIGNAL WHEN STACK FLUSH IS REQUIRED */ 01595000
- REQFLUSH: PROC(OPCODE) RETURNS(BIT(1)); 01596000
- DCL OPCODE CHAR(8); 01597000
- DCL I FIXED BIN STATIC, 01598000
- NOFLUSH(26) CHAR(8) STATIC INIT( 01599000
- ' ','DROP','USING','EQU', 01600000
- 'TITLE','SUBTITLE','PRINT','EJECT','SPACE', 01601000
- 'ICTL','ISEQ','PUNCH', 01602000
- 'MNOTE','AIF','ANOP','AGO','ACTR', 01603000
- 'GBLA','GBLB','GBLC','LCLA','LCLB','LCLC','SETA','SETB','SETC' 01604000
- ); 01605000
- 01606000
- DO I=1 TO 26; 01607000
- IF OPCODE=NOFLUSH(I) THEN RETURN(#FALSE); 01608000
- END; 01609000
- RETURN(#TRUE); 01610000
- END REQFLUSH; 01611000
- END WFLUSH ; 01612000
- 1 01613000
- /* FLUSH LABEL EQUIVALENCING STACK */ 01614000
- EQVFLUSH: 01615000
- PROCEDURE(LEVZ,ELEVL); 01616000
- DCL 01617000
- LEVZ BIT(1), 01618000
- ELEVL FIXED BIN, 01619000
- I FIXED BIN STATIC; /*RAF-41*/ 01619500
- DCL 01620000
- EQVBUF CHAR(80) STATIC INIT(' EQU') UNALIGNED, /*RAF-46*/ 01621000
- E_LABEL CHAR(8) POS(1) DEF EQVBUF UNALIGNED, /*RAF-46*/ 01622000
- E_OPERAND CHAR(61) POS(20) DEF EQVBUF UNALIGNED; /*RAF-46*/ 01623000
- IF EQVLEV>0 THEN 01624000
- DO; 01625000
- DO I = ELEVL TO EQVLEV; 01626000
- E_LABEL = EQVSTK(I,1); 01627000
- IF E_LABEL ^= ' ' THEN 01628000
- DO; 01629000
- E_OPERAND = EQVSTK(I,2); 01630000
- /* IF ((SUBSTR(E_OPERAND,1,1)='@') | */ /*RAF-12*/ 01631000
- /* (SUBSTR(E_OPERAND,1,1)^='@' & */ /*RAF-12*/ 01632000
- IF LEVZ | SYMDEF(EQVSTK(I,2)) THEN /*RAF-12*/ 01633000
- DO; 01634000
- EQVSTK(I,*) = ''; 01635000
- WRITE FILE(SYSOUT) FROM(EQVBUF); 01636000
- END; 01637000
- END; 01638000
- END; 01639000
- IF LEVZ THEN 01640000
- EQVLEV = 0; 01641000
- END; 01642000
- RETURN; 01643000
- 01644000
- SYMDEF: PROCEDURE(SYMBOL) RETURNS(BIT(1)); 01645000
- DCL SYMBOL CHAR(*) VARYING; 01646000
- DCL I FIXED BIN STATIC; 01647000
- 01648000
- DO I=SYMLEV TO 1 BY -1; 01649000
- IF SYMSTK(I)=SYMBOL THEN RETURN(#TRUE); 01650000
- END; 01651000
- RETURN(#FALSE); 01652000
- END SYMDEF; 01653000
- 01654000
- END EQVFLUSH; 01655000
- 1 01656000
- LABFLUSH: PROCEDURE; 01657000
- DCL 01658000
- I FIXED BIN STATIC, 01659000
- FLUSHBUF CHAR(80) STATIC UNALIGNED /*RAF-46*/ 01660000
- INIT(' DS 0H'), /*RAF-46*/ 01660100
- F_LABEL CHAR(8) POS(1) DEF FLUSHBUF UNALIGNED, /*RAF-46*/ 01661000
- F_ID CHAR(8) POS(73) DEF FLUSHBUF UNALIGNED; /*RAF-46*/ 01662000
- 01663000
- F_ID = CIN_ID; 01664000
- IF LABLEV>0 THEN 01665000
- DO; 01666000
- LABEL_WRITTEN = #TRUE; 01667000
- DO I = 1 TO LABLEV; 01668000
- F_LABEL = LABSTK(I); 01669000
- WRITE FILE(SYSOUT) FROM(FLUSHBUF); 01670000
- END; 01671000
- LABLEV = 0; 01672000
- END; 01673000
- RETURN; 01674000
- END LABFLUSH; 01675000
- 1 01676000
- /* PUSH NON-SEQUENCE LABELS */ 01677000
- LABPUSH: PROCEDURE; 01678000
- DCL 01679000
- (I,J) FIXED BIN STATIC, /*RAF-41*/ 01680000
- SEQBUF CHAR(80) STATIC INIT(' ANOP') UNAL, /*RAF-46*/ 01681000
- S_LABEL CHAR(8) POS(1) DEF SEQBUF UNALIGNED, /*RAF-46*/ 01682000
- S_ID CHAR(8) POS(73) DEF SEQBUF UNALIGNED, /*RAF-46*/ 01683000
- S_COL1 CHAR(1) POS(1) DEF SEQBUF UNALIGNED; /*RAF-46*/ 01684000
- 01685000
- IF C_LABEL^=' ' & SUBSTR(C_LABEL,1,1)^='.' THEN 01686000
- DO; 01687000
- LABLEV = LABLEV+1; 01688000
- LABSTK(LABLEV) = C_LABEL; 01689000
- C_LABEL = ''; 01690000
- END; 01691000
- 01692000
- PERPUSH: ENTRY; 01693000
- IF LABLEV>0 THEN 01694000
- DO; 01695000
- S_ID = CIN_ID; 01696000
- J = 0; 01697000
- DO I=1 TO LABLEV; 01698000
- S_LABEL = LABSTK(I); 01699000
- IF S_COL1='.' THEN 01700000
- WRITE FILE(SYSOUT) FROM(SEQBUF); 01701000
- ELSE 01702000
- DO; 01703000
- J = J+1; 01704000
- LABSTK(J) = LABSTK(I); 01705000
- END; 01706000
- END; 01707000
- IF LABLEV^=J THEN 01708000
- DO; 01709000
- LABLEV = J; 01710000
- LABEL_WRITTEN = #TRUE; 01711000
- END; 01712000
- END; 01713000
- RETURN; 01714000
- END LABPUSH; 01715000
- 0 01716000
- /* GENERATE A LABEL SYMBOL */ 01717000
- GENSYM: PROCEDURE RETURNS(CHAR(8) VARYING); 01718000
- GENNUM = GENNUM+1; 01719000
- IF IN_MACRO THEN 01720000
- RETURN('@&@.'||SUBSTR(GENNUM,6)); 01721000
- ELSE 01722000
- RETURN('@'||SUBSTR(GENNUM,5)); 01723000
- 01724000
- /* GENERATE A SEQUENCE SYMBOL */ 01725000
- GENSEQSYM: ENTRY RETURNS(CHAR(8) VARYING); 01726000
- GENNUM = GENNUM+1; 01727000
- RETURN('.@'||SUBSTR(GENNUM,5)); 01728000
- 01729000
- END GENSYM; 01730000
- 1 01731000
- /* PROCEDURE TO ADD A LABEL AND TARGET TO THE EQUIVALENCING STACK */ 01732000
- EQVADD: PROCEDURE(EQLABEL,EQTARGET); 01733000
- DCL (EQLABEL,EQTARGET) CHAR(*) VARYING; 01734000
- DCL I FIXED BIN STATIC, /*RAF-41*/ 01735000
- HIT BIT(1) STATIC; /*RAF-41*/ 01736000
- 01737000
- HIT = #FALSE; /*RAF-41*/ 01737500
- DO I=1 TO EQVLEV; 01738000
- IF EQVSTK(I,1)='' THEN 01739000
- DO; 01740000
- IF ^HIT THEN 01741000
- DO; 01742000
- HIT = #TRUE; 01743000
- EQVSTK(I,1) = EQLABEL; 01744000
- EQVSTK(I,2) = EQTARGET; 01745000
- END; 01746000
- END; 01747000
- ELSE 01748000
- DO; 01749000
- IF EQVSTK(I,2)=EQLABEL THEN 01750000
- EQVSTK(I,2) = EQTARGET; 01751000
- IF EQTARGET=EQVSTK(I,1) THEN 01752000
- EQTARGET = EQVSTK(I,2); 01753000
- END; 01754000
- END; 01755000
- IF ^HIT THEN 01756000
- DO; 01757000
- EQVLEV = EQVLEV+1; 01758000
- EQVSTK(I,1) = EQLABEL; 01759000
- EQVSTK(I,2) = EQTARGET; 01760000
- END; 01761000
- RETURN; 01762000
- 01763000
- END EQVADD; 01764000
- 1 01765000
- /* INPUT: */ /* ALP INPUT ROUTINES */ /*RAF-41*/ 01766000
- /* PROCEDURE ; */ /*RAF-41*/ 01767000
- 01768000
- /* 01769000
- RWORD READ WORD INTO 'WORD' 01770000
- SKIP,INC 01771000
- ALPHANUM 01772000
- RLABEL READ LABEL INTO 'WORD' 01773000
- SKIP,INC 01774000
- ALPHANUM 01775000
- ROPANDS READ OPERANDS INTO 'OPANDS' 01776000
- SKIP,INC 01777000
- RCHAR('C') READ CHAR IF IT IS 'C' 01778000
- SKIP,INC 01779000
- RCHECK(CHKWORD) READ 'CHKWORD' IF PRESENT 01780000
- SKIP,INC 01781000
- ALPHANUM 01782000
- */ 01783000
- 01784000
- /*DECLARE */ /*RAF-41*/ 01785000
- /* STARTCOL FIXED BIN STATIC, */ /*RAF-41*/ 01786000
- /* I FIXED BIN STATIC; */ /*RAF-41*/ 01787000
- 1 01788000
- RWORD: PROCEDURE; /*RAF-41*/ 01789000
- /* READ NEXT TOKEN INTO 'WORD'. A TOKEN IS A SINGLE 01790000
- SPECIAL CHARACTER OR 1-8 ALPHANUMERICS. 'WORDAL' 01791000
- IS SET TO #TRUE IFF 'WORD' IS ALPHANUMERIC. */ 01792000
- DCL (STARTCOL,I) FIXED BIN STATIC; /*RAF-41*/ 01792500
- CALL SKIP; 01793000
- IF COL<71 & SUBSTR(CARDIN,COL,2)='&&' 01794000
- & ALPHANUM(SUBSTR(CARDIN,COL+2,1)) THEN 01795000
- DO; 01796000
- COL = COL+1 ; 01797000
- CHAR = 'A' ; 01798000
- END; 01799000
- IF ^ALPHANUM(CHAR) THEN 01800000
- DO ; /* WORD IS NOT ALPHANUMERIC */ 01801000
- WORD = CHAR ; 01802000
- IF CHAR ^= ';' THEN 01803000
- CALLINC; 01804000
- WORDAL = #FALSE ; 01805000
- END; 01806000
- ELSE 01807000
- DO ; 01808000
- WORDAL = #TRUE ; /* WORD IS ALPHANUMERIC */ 01809000
- STARTCOL = COL ; 01810000
- DO I = 0 BY 1 WHILE(ALPHANUM(CHAR)) ; 01811000
- CALLINC; 01812000
- END; 01813000
- WORD = SUBSTR(CARDIN,STARTCOL,I) ; 01814000
- IF I>8 & INAL^=0 THEN /*RAF-10*/ 01815000
- CALL ERROR('RW40: TOO MANY CHARACTERS IN WORD "'|| 01816000
- SUBSTR(CARDIN,STARTCOL,I)||'".'); 01817000
- END; 01818000
- RETURN; 01819000
- END RWORD; /*RAF-41*/ 01819500
- 1 01820000
- RLABEL: PROCEDURE; /*RAF-41*/ 01821000
- /* SCAN OFF A LABEL : BEGINS WITH 'A'-'Z','@','#','$',01822000
- AND '.' OR '&' AS SPECIAL CASES. ENDS WITH BLANK OR 01823000
- ANY NON-ALPHANUMERIC OTHER THAN '.' '&' '(' ')' */ 01824000
- DCL LABEL CHAR(20) VARYING STATIC; /*RAF-41*/ 01825000
- DCL STARTCOL FIXED BIN STATIC; /*RAF-41*/ 01825500
- CALL SKIP; 01826000
- IF ^ALPHANUM(CHAR) & CHAR^='.' & CHAR^='&' THEN 01827000
- DO ; /* WORD IS NOT ALPHANUMERIC */ 01828000
- WORDAL = #FALSE ; 01829000
- WORD = CHAR ; 01830000
- IF CHAR ^= ';' THEN 01831000
- CALLINC; 01832000
- RETURN ; 01833000
- END; 01834000
- 01835000
- WORDAL = #TRUE; 01836000
- IF CHAR='.' THEN 01837000
- DO; 01838000
- LABEL = '.'; 01839000
- CALLINC; 01840000
- END; 01841000
- ELSE 01842000
- LABEL = ''; 01843000
- STARTCOL = COL; 01844000
- DO WHILE(ALPHANUM(CHAR) | CHAR='&' | CHAR='.' /*RAF-26*/ 01845000
- | (CHAR='(' 01846000
- /*RAF-3*/ /* & (SUBSTR(LABEL,1,1)='&' & SUBSTR(CARDIN,COL+1,1)='&')) */01847000
- | (CHAR=')' 01848000
- /*RAF-3*/ /* & (SUBSTR(LABEL,1,1)='&') */ ))); 01849000
- IF CHAR='&' THEN 01850000
- DO; 01851000
- CALLINC; 01852000
- LABEL = LABEL||SUBSTR(CARDIN,STARTCOL,COL-STARTCOL); 01853000
- IF CHAR='&' THEN 01854000
- CALLINC; 01855000
- ELSE 01856000
- CALL ERROR('LB40: "&" INSERTED.'); 01857000
- STARTCOL = COL; 01858000
- END; 01859000
- ELSE 01860000
- CALLINC; 01861000
- END; 01862000
- LABEL = LABEL||SUBSTR(CARDIN,STARTCOL,COL-STARTCOL) ; 01863000
- IF LENGTH(LABEL)>8 THEN 01864000
- CALL ERROR('LB60: TOO MANY CHARACTERS IN LABEL "'||LABEL||'".');01865000
- WORD = LABEL; 01866000
- IF CHAR^=' ' & CHAR^=':' & CHAR^=';' & CHAR^='>' THEN 01867000
- CALL ERROR('LB50: BLANK INSERTED.'); 01868000
- RETURN; 01869000
- END RLABEL; /*RAF-41*/ 01869500
- 1 01870000
- ROPANDS: 01871000
- PROCEDURE(COMMASW); /*RAF-41*/ /*RAF-9*/ 01872000
- /* BUILD OPERANDS OF A NON-ALP INSTRUCTION IN "OPANDS" */ 01873000
- DCL COMMASW BIT(1), /*RAF-9*/ 01873100
- TERMCHAR CHAR(8) VARYING STATIC; /*RAF-41*/ /*RAF-9*/ 01873200
- DCL STARTCOL FIXED BIN STATIC; /*RAF-41*/ 01873250
- IF COMMASW THEN TERMCHAR=' %;|&>:,'; /*RAF-9*/ 01873300
- ELSE TERMCHAR = ' %;|&>'; /*RAF-9*/ 01873400
- OPANDS = ''; 01874000
- ROA: CALL SKIP; 01875000
- STARTCOL = COL; 01876000
- RO_CHARLOOP: 01877000
- DO WHILE(#TRUE); 01878000
- IF INDEX(TERMCHAR, CHAR) /* TERMINAL CHARS */ THEN /*RAF-9*/ 01879000
- DO; 01880000
- IF OPANDS = '' THEN 01881000
- OPANDS = SUBSTR(CARDIN,STARTCOL,COL-STARTCOL); 01882000
- ELSE 01883000
- OPANDS = OPANDS||SUBSTR(CARDIN,STARTCOL,COL-STARTCOL);01884000
- IF CHAR='&' & COL<72 & SUBSTR(CARDIN,COL+1,1)='&' THEN 01885000
- DO; 01886000
- STARTCOL,COL = COL+1; 01887000
- CALLINC; 01888000
- GO TO RO_CHARLOOP; 01889000
- END; 01890000
- GO TO OPTRUNC; 01891000
- END; 01892000
- IF CHAR = '_' /* INPUT CONTINUATION */ THEN 01893000
- DO; 01894000
- IF OPANDS = '' THEN 01895000
- OPANDS = SUBSTR(CARDIN,STARTCOL,COL-STARTCOL); 01896000
- ELSE 01897000
- OPANDS = OPANDS||SUBSTR(CARDIN,STARTCOL,COL-STARTCOL);01898000
- CALLINC; 01899000
- GO TO ROA; 01900000
- END; 01901000
- IF CHAR = '''' THEN 01902000
- DO; 01903000
- IF COL>1 THEN 01904000
- DO; 01905000
- IF VERIFY(SUBSTR(CARDIN,COL-1,1), /*RAF-14*/ 01906000
- 'LKNTSI')^=0 THEN /*RAF-14*/ 01906500
- GO TO RO_PRIMES; 01907000
- END; 01908000
- ELSE 01909000
- DO; 01910000
- IF SUBSTR(OPANDS,LENGTH(OPANDS),1) ^= 'L' THEN 01911000
- GO TO RO_PRIMES; 01912000
- END; 01913000
- END; 01914000
- CALLINC ; 01915000
- END RO_CHARLOOP ; 01916000
- 01917000
- OPTRUNC: 01918000
- RETURN; 01919000
- 1 01920000
- RO_PRIMES: 01921000
- CALLINC; 01922000
- RO_PRIMELOOP: 01923000
- DO WHILE(CHAR ^= ''''); 01924000
- IF COL > 72 THEN 01925000
- DO ; 01926000
- CALL ERROR('RO30: MISSING QUOTE IN "'||CARDIN||'".'); 01927000
- RETURN; 01928000
- END; 01929000
- CALLINC; 01930000
- END RO_PRIMELOOP; 01931000
- CALLINC ; /* SKIP PRIME */ 01932000
- 01933000
- /* IF NOT LITERAL CONTINUE */ 01934000
- IF SUBSTR(CARDIN, COL ,1) ^= '_' THEN 01935000
- GO TO RO_CHARLOOP; 01936000
- /* CONTINUED LITERAL : */ 01937000
- COL = COL - 1 ; 01938000
- OPANDS = OPANDS||SUBSTR(CARDIN,STARTCOL,COL-STARTCOL); 01939000
- CALLINC; 01940000
- CALLINC; 01941000
- CALL SKIP; 01942000
- STARTCOL = COL + 1 ; 01943000
- IF CHAR = '''' THEN 01944000
- GO TO RO_PRIMES ; 01945000
- CALL ERROR('RO50: IMPROPERLY CONTINUED LITERAL.'); 01946000
- RETURN; 01947000
- END ROPANDS; /*RAF-41*/ 01947500
- 1 01948000
- /* ENTRY TO SCAN OFF CONDITION CLAUSE FOR CONDITIONAL ASM */ 01949000
- CONDSCAN: PROCEDURE(PARSW) RETURNS(CHAR(170) VAR); /*RAF-41*//*RAF-9*/ 01950000
- DCL 01951000
- PARSW BIT(1), /*RAF-9*/ 01951500
- PLEV FIXED BIN STATIC, 01952000
- CONDSTR CHAR(170) VAR STATIC; 01953000
- DCL 01954000
- (CSTATE,INDX) FIXED BIN STATIC, 01955000
- STATE(3,4) LABEL /* STATIC */ INIT 01956000
- (S11,S12,S13,S14, 01957000
- S21,S22,S23,S24, 01958000
- S31,S32,S33,S34); 01959000
- 01960000
- IF ^PARSW THEN DO; /*RAF-9*/ 01960100
- IF ^RCHAR('(') THEN DO; /*RAF-9*/ 01960200
- CALL ERROR('CONDSCAN: MISSING CONDITION CLAUSE');/*RAF-9*/ 01960300
- RETURN(''); /*RAF-9*/ 01960400
- END; /*RAF-9*/ 01960500
- END; /*RAF-9*/ 01960600
- /*RAF-9*/ 01960700
- PLEV = 1; 01961000
- CONDSTR = '('; 01962000
- GO TO NXT2; 01963000
- NXT1: CALLINC; 01964000
- NXT2: IF CHAR = '(' THEN 01965000
- PLEV = PLEV+1; 01966000
- ELSE 01967000
- IF CHAR = ')' THEN 01968000
- DO; 01969000
- PLEV = PLEV-1; 01970000
- IF PLEV = 0 THEN 01971000
- DO; 01972000
- CONDSTR = CONDSTR||')'; 01973000
- CALLINC; 01974000
- RETURN(CONDSTR); 01975000
- END; 01976000
- END; 01977000
- ELSE 01978000
- IF CHAR = '_' | CHAR = '%' THEN 01979000
- DO; 01980000
- IF CHAR = '_' THEN 01981000
- CALLINC; 01982000
- CALL SKIP; 01983000
- GO TO NXT2; 01984000
- END; 01985000
- ELSE 01986000
- IF CHAR = '&' THEN 01987000
- DO; 01988000
- IF SUBSTR(CONDSTR,LENGTH(CONDSTR),1) = '&' THEN 01989000
- GO TO NXT1; 01990000
- END; 01991000
- ELSE 01992000
- IF CHAR = '''' THEN 01993000
- IF VERIFY(SUBSTR(CONDSTR,LENGTH(CONDSTR),1), /*RAF-14*/ 01994000
- 'LKNTSI')^=0 THEN /*RAF-14*/ 01994500
- DO; 01995000
- CONDSTR = CONDSTR||CHAR; 01996000
- CSTATE = 1; 01997000
- NC: CALLINC; 01998000
- NC2: IF COL = 73 THEN 01999000
- INDX = 1; 02000000
- ELSE 02001000
- IF CHAR = '''' THEN 02002000
- INDX = 2; 02003000
- ELSE 02004000
- IF CHAR = '_' THEN 02005000
- INDX = 3; 02006000
- ELSE 02007000
- INDX = 4; 02008000
- GO TO STATE(CSTATE,INDX); 02009000
- S11: /* IN STRING == EOL */ 02010000
- CALL ERROR('COND: MISSING TERMINATING QUOTE.'); 02011000
- CONDSTR = CONDSTR||''''; 02012000
- GO TO CONDX; 02013000
- S12: /* IN STRING == QUOTE */ 02014000
- CSTATE = 2; 02015000
- S13: /* IN STRING == UNDERSCORE */ 02016000
- S14: /* IN STRING == OTHER */ 02017000
- ADC: CONDSTR = CONDSTR||CHAR; 02018000
- GO TO NC; 02019000
- S21: /* TERMINATE TEST == EOL */ 02020000
- GO TO NXT1; 02021000
- S22: /* TERMINATE TEST == QUOTE */ 02022000
- CSTATE = 1; 02023000
- GO TO ADC; 02024000
- S23: /* TERMINATE TEST == UNDERSCORE */ 02025000
- CSTATE = 3; 02026000
- CALLINC; 02027000
- CALL SKIP; 02028000
- GO TO NC2; /*RAF-21*/ 02028500
- S24: /* TERMINATE TEST == OTHER */ 02029000
- GO TO CONDX; 02030000
- S31: /* CONTINUATION TEST == EOL */ 02031000
- GO TO CONDX; 02032000
- S32: /* CONTINUATION TEST == QUOTE */ 02033000
- CONDSTR = SUBSTR(CONDSTR,1,LENGTH(CONDSTR)-1); 02034000
- CSTATE = 1; /*RAF-21*/ 02034500
- GO TO NC; 02035000
- S33: /* CONTINUATION TEST == UNDERSCORE */ 02036000
- CALLINC; 02037000
- CALL SKIP; 02038000
- GO TO NC2; 02039000
- S34: /* CONTINUATION TEST == OTHER */ 02040000
- CONDX: GO TO NXT2; 02041000
- END; 02042000
- CONDSTR = CONDSTR||CHAR; 02043000
- GO TO NXT1; 02044000
- END CONDSCAN; /*RAF-41*/ 02044500
- 1 02045000
- RCHAR: 02046000
- PROCEDURE(CH) RETURNS(BIT(1)); /*RAF-41*/ 02047000
- DCL 02048000
- CH CHAR(1); 02049000
- /* TEST INPUT FOR CHARACTER: ADVANCE INDEX IF PRESENT */ 02050000
- CALL SKIP ; 02051000
- IF CH = CHAR THEN 02052000
- DO; 02053000
- CALLINC; 02054000
- RETURN(#TRUE); 02055000
- END ; 02056000
- ELSE 02057000
- RETURN (#FALSE) ; 02058000
- END RCHAR; /*RAF-41*/ 02058500
- - 02059000
- /* VALUE TRUE AND SKIP WORD IFF NEXT WORD IS 'CHKWORD' */ 02060000
- RCHECK: 02061000
- PROCEDURE(CHKWORD) RETURNS(BIT(1)); /*RAF-41*/ 02062000
- DCL 02063000
- CHKWORD CHAR(*) VARYING; 02064000
- DCL 02065000
- LEN FIXED BIN STATIC; 02066000
- LEN=LENGTH(CHKWORD); 02067000
- CALL SKIP ; 02068000
- IF COL+LEN<=73 THEN /*RAF-41*/ 02068500
- IF SUBSTR(CARDIN,COL,LEN) = CHKWORD & (COL+LEN=73 | /*RAF-41*/ 02069000
- ^ALPHANUM(SUBSTR(CARDIN,COL+LEN,1))) THEN /*RAF-41*/ 02070000
- DO; 02071000
- /* DO I = 1 TO LEN ; */ /*RAF-41*/ 02072000
- COL = COL+LEN-1; /*RAF-41*/ 02072500
- CALLINC; 02073000
- /* END; */ /*RAF-41*/ 02074000
- RETURN(#TRUE) ; 02075000
- END; 02076000
- /* ELSE */ /*RAF-47*/ 02077000
- RETURN (#FALSE) ; 02078000
- END RCHECK; /*RAF-41*/ 02078500
- - 02079000
- /*ALPHATST: */ /*RAF-41*/ 02080000
- /*ENTRY(CHR) RETURNS(BIT(1)); */ /*RAF-41*/ 02081000
- /*DCL */ /*RAF-41*/ 02082000
- /* CHR CHAR(1); */ /*RAF-41*/ 02083000
- /* RETURN(ALPHANUM(CHR)); */ /*RAF-41*/ 02084000
- 1 02085000
- INC: PROCEDURE; 02086000
- DCL ( (NSP,NTB) FIXED BIN, /*RAF-17*/ 02087000
- FORMCON BIT(1), 02088000
- SPLINE CHAR(80) INIT(' SPACE') ) STATIC, 02089000
- 1 MSPLINE STATIC, 02090000
- 2 PERSTAR CHAR(2) INIT('.*'), 02091000
- 2 MSP CHAR(70) INIT(' '), 02092000
- 2 MSPID CHAR(8), 02093000
- 1 BALCOM STATIC, 02094000
- 2 ASTR CHAR(3) INIT('* '), 02095000
- 2 COMFLD CHAR(68), 02096000
- 2 COMBLK CHAR(1) INIT(' '), 02097000
- 2 COMID CHAR(8); 02098000
- DECLARE DOTSLSW BIT(1) STATIC; /*RAF-41*/ /*RAF-20*/ 02098500
- 02099000
- COL = 0; 02100000
- DOTSLSW = #FALSE; /*RAF-20*/ 02100500
- READ FILE(SYSIN) INTO(CARDIN) ; 02101000
- DO WHILE(CIN_2COLS='./'); /*RAF-9*/ 02101100
- IF NESTLEV^=0 THEN /*RAF-9*/ 02101110
- CALL ERROR('INC: ./ CONTROL CARD NOT AT LEVEL 0'); /*RAF-9*/ 02101120
- CALL LABPUSH; CALL LABFLUSH; /*RAF-9*/ 02101200
- CALL EQVFLUSH(#TRUE,1); /*RAF-9*/ 02101300
- SPLINE = '*'; /*RAF-9*/ 02101350
- IF ^DOTSLSW THEN SIGNAL ENDPAGE(SYSPRINT);/*RAF-20*//*RAF-9*/ 02101400
- PUT FILE(SYSPRINT) EDIT (NESTLEV,CIN_ID,CIN_DATA) /*RAF-9*/ 02101500
- (COL(1),X(2),P'Z9',X(2),A,X(1),A); /*RAF-9*/ 02101600
- WRITE FILE(SYSOUT) FROM(CARDIN); /*RAF-9*/ 02101700
- READ FILE(SYSIN) INTO(CARDIN); /*RAF-9*/ 02101800
- DOTSLSW = #TRUE; /*RAF-20*/ 02101850
- END; /*RAF-9*/ 02101900
- IF CIN_DATA=' ' THEN DO; /*RAF-17*/ 02102000
- FORMCON = #FALSE; 02103000
- NSP = 1; /*RAF-17*/ 02103100
- END; /*RAF-17*/ 02103200
- ELSE 02104000
- DO; 02105000
- NSP = VERIFY(CIN_DATA,' '); 02106000
- FORMCON = SUBSTR(CIN_DATA,NSP,5)='SPACE' | 02107000
- SUBSTR(CIN_DATA,NSP,5)='EJECT' | 02108000
- SUBSTR(CIN_DATA,NSP,5)='TITLE' | 02109000
- SUBSTR(CIN_DATA,NSP,8)='SUBTITLE' ; 02110000
- END; 02111000
- IF SUBTITL THEN SIGNAL ENDPAGE(SYSPRINT); 02112000
- IF ^FORMCON | INAL=0 THEN 02113000
- DO; 02114000
- IF INAL=0 THEN NSP = 1; /*RAF-17*/ 02114100
- NTB = 0; /*RAF-17*/ 02114200
- IF NESTLEV*3<117-(72-NSP) /*RAF-17*/ 02114300
- THEN DO WHILE(SUBSTR(CIN_DATA,72-NTB,1)=' ' /*RAF-17*/ 02114400
- & NTB<72); NTB = NTB+1; END; /*RAF-17*/ 02114500
- PUT FILE(SYSPRINT) EDIT (NESTLEV,CIN_ID, /*RAF-17*/ 02115000
- SUBSTR(CIN_DATA,NSP,73-NSP-NTB)) /*RAF-17*/ 02115100
- (COL(1),X(2),P'Z9',X(2),A,X(1), /*RAF-17*/ 02116000
- X(MIN(NESTLEV*3,117-(72-NSP-NTB))),A); /*RAF-17*/ 02116100
- IF INAL > 0 THEN 02117000
- DO; 02118000
- COMFLD = SUBSTR(CARDIN,1,68); 02119000
- COMID = CIN_ID; 02120000
- IF INAL = 1 THEN 02121000
- DO; 02122000
- INAL = 2; 02123000
- IF ^IN_MACRO THEN 02124000
- DO; 02125000
- WRITE FILE(SYSOUT) FROM(SPLINE); 02126000
- ASTR = '* '; 02127000
- END; 02128000
- ELSE 02129000
- DO; 02130000
- MSPID = CIN_ID; 02131000
- WRITE FILE(SYSOUT) FROM(MSPLINE); 02132000
- ASTR = '.* '; 02133000
- END; 02134000
- END; 02135000
- WRITE FILE(SYSOUT) FROM(BALCOM); 02136000
- END; 02137000
- END; 02138000
- COUT_ID = CIN_ID; /* COPY SEQUENCE FIELD */ 02139000
- RETURN; 02140000
- END INC ; 02141000
- 1 02142000
- /*ALPHANUM: */ /*RAF-41*/ 02143000
- /*PROCEDURE(A) RETURNS(BIT(1)); */ /*RAF-41*/ 02144000
- /*DCL */ /*RAF-41*/ 02145000
- /* A CHAR(1); */ /*RAF-41*/ 02146000
- /* VALUE IS TRUE IFF ARGUMENT CHARACTER IS "ALPHANUMERIC" */ 02147000
- /* NOTE THAT $,# AND @ ARE ALPHABETIC IN BAL AND THEREFORE IN AL. */ 02148000
- /* IF A >= 'A' | A = '$' | A = '@' | A = '#' THEN */ /*RAF-41*/ 02149000
- /* RETURN(#TRUE); */ /*RAF-41*/ 02150000
- /* ELSE */ /*RAF-41*/ 02151000
- /* RETURN(#FALSE); */ /*RAF-41*/ 02152000
- /*END ALPHANUM ; */ /*RAF-41*/ 02153000
- - 02154000
- SKIP: 02155000
- PROCEDURE; /* SKIP TO NEXT DATUM (PAST BLANKS AND COMMENTS */ 02156000
- /* DO WHILE(CHAR = ' ' | CHAR = '%'); */ /*RAF-41*/ 02157000
- /* IF CHAR = ' ' THEN */ /*RAF-41*/ 02158000
- /* CALLINC; */ /*RAF-41*/ 02159000
- /* ELSE */ /*RAF-41*/ 02160000
- /* DO; */ /* SKIP TO "EOL" */ /*RAF-41*/ 02161000
- /* COL = 73; */ /*RAF-41*/ 02162000
- /* CALLINC; */ /*RAF-41*/ 02163000
- /* END; */ /*RAF-41*/ 02164000
- /* END; */ /*RAF-41*/ 02165000
- /* RETURN; */ /*RAF-41*/ 02166000
- /*RAF-41*/ 02166010
- DCL NBLANKS FIXED BIN(31) STATIC; /*RAF-41*/ 02166020
- /*RAF-41*/ 02166030
- DO WHILE('1'B); /*RAF-41*/ 02166040
- DO WHILE(CHAR=' '); /*RAF-41*/ 02166050
- IF COL>=72 THEN DO; /*RAF-41*/ 02166060
- CALL INC; /*RAF-41*/ 02166070
- COL = 1; /*RAF-41*/ 02166080
- CHAR = SUBSTR(CARDIN,1,1); /*RAF-41*/ 02166090
- END; /*RAF-41*/ 02166100
- ELSE DO; /*RAF-41*/ 02166110
- NBLANKS = VERIFY(SUBSTR(CIN_DATA,COL),' ')-1; /*RAF-41*/ 02166120
- IF NBLANKS>0 THEN DO; /*RAF-41*/ 02166130
- COL = COL+NBLANKS; /*RAF-41*/ 02166140
- CHAR = SUBSTR(CARDIN,COL,1); /*RAF-41*/ 02166150
- END; /*RAF-41*/ 02166160
- ELSE DO; /*RAF-41*/ 02166170
- CALL INC; /*RAF-41*/ 02166180
- COL = 1; /*RAF-41*/ 02166190
- CHAR = SUBSTR(CARDIN,1,1); /*RAF-41*/ 02166200
- END; /*RAF-41*/ 02166210
- END; /*RAF-41*/ 02166220
- END; /*RAF-41*/ 02166230
- IF CHAR='%' THEN DO; /*RAF-41*/ 02166240
- CALL INC; /*RAF-41*/ 02166250
- COL = 1; /*RAF-41*/ 02166260
- CHAR = SUBSTR(CARDIN,1,1); /*RAF-41*/ 02166270
- END; /*RAF-41*/ 02166280
- ELSE RETURN; /*RAF-41*/ 02166290
- END; /*RAF-41*/ 02166300
- END SKIP; 02167000
- - 02168000
- /* END INPUT; */ /*RAF-41*/ 02169000
- 1 02170000
- ERROR: /* ALP ERROR MESSAGE OUTPUT ROUTINES */ 02171000
- PROCEDURE(MSG) ; 02172000
- DCL 02173000
- MSG CHAR(*) VAR ; 02174000
- PUT SKIP(2) FILE(SYSTERM) EDIT(CIN_ID,CIN_DATA,MSG) (A,X(1),A,SKIP,A);02175000
- PUT SKIP FILE(SYSTERM) EDIT('INPUT AT CHARACTER ''',CHAR,'''', 02176000
- ', COLUMN ',COL,' LINE ',CIN_ID, 02177000
- ', LAST WORD WAS ''',WORD,'''') (A,A,A,A,F(3),A,A,A,A,A); 02178000
- PUT SKIP(2) FILE(SYSPRINT) EDIT('ERROR: ',MSG) (A,A); 02179000
- PUT SKIP FILE(SYSPRINT) EDIT('INPUT AT CHARACTER ''',CHAR,'''', 02180000
- ', COLUMN ',COL,' LINE ',CIN_ID, 02181000
- ', LAST WORD WAS ''',WORD,'''') (A,A,A,A,F(3),A,A,A,A,A); 02182000
- PUT SKIP(2) FILE(SYSPRINT) ; 02183000
- ERRCNT=ERRCNT+1; 02184000
- RETCODE=8; 02185000
- RETURN ; 02186000
- 0OUTPUT: 02187000
- ENTRY (MSG) ; 02188000
- PUT SKIP FILE(SYSPRINT) EDIT(MSG) (A); 02189000
- PUT SKIP FILE(SYSTERM) EDIT(MSG) (A); 02190000
- RETURN; 02191000
- END ERROR ; 02192000
- - 02193000
- END ALP; 02194000
-